剩余结果为空 api

Empty result from rest api

我想创建一个服务,以便从数据库中填充下拉列表。我试过这个:

商家Class:

export class Merchant {
  constructor(
    public id: string,
    public name: string,
    public state_raw: string,
    public users: string,
  ) {}
}

商家服务:

 getList(): Observable<Merchant> {
    return this.http.get<Merchant>(environment.api.urls.merchants.base, {});
  }

SQL查询:

@Override
    public Iterable<Merchants> findAll() {
        String hql = "select e from " + Merchants.class.getName() + " e";
        TypedQuery<Merchants> query = entityManager.createQuery(hql, Merchants.class);
        List<Merchants> merchants = query.getResultList();
        return merchants;
    }

工作示例:

    @GetMapping("/list")
public Iterable<Merchants> getMerchantsList() {
    return merchantRepository
            .findAll();
}

我试过这个:

@GetMapping("/list")
public ResponseEntity<?> getMerchantsList() {
    return StreamSupport.stream(merchantRepository.findAll().spliterator(), false)
            .map(mapper::toDTO)
            .map(ResponseEntity::ok)
            .findFirst()
            .orElseGet(() -> notFound().build());
}

我想在发送响应之前使用映射器。当前 Angular 中的列表是空的。可能我应该 return Iterable<Merchants> 而不是 ResponseEntity<MerchantDTO>?

我用Java10.

双方都有几个问题。让我们从服务器端开始。您想要 return list 商家来填充下拉列表 list,因此您正确地将方法命名为 getMerchants列表()。但是,它不是 returning list,而是 returns voidvoid 什么都不是,nada,因此是空洞的回应。

所以你需要return一个List<Merchant>,或者,如果你真的想要(但这里没有必要,因为你不想设置响应主体以外的任何东西),一个ResponseEntity<List<Merchant>>。调用 findFirst() 会适得其反。您不需要列表中的第一个商家。您想要整个列表:

@GetMapping("/list")
public List<MerchantDTO> getMerchantsList() {
    return StreamSupport.stream(merchantRepository.findAll().spliterator(), false)
            .map(mapper::toDTO)
            .collect(Collectors.toList());
}

@GetMapping("/list")
public ResponseEntity<List<MerchantDTO>> getMerchantsList() {
    List<MerchantDTO> list = StreamSupport.stream(merchantRepository.findAll().spliterator(), false)
            .map(mapper::toDTO)
            .collect(Collectors.toList());
    return ResponseEntity.ok(list);
}

请注意,如果您的 findAll() 方法 return 是一个 List 而不是 Iterable,代码会更简单。您可以只使用 findAll().stream() 来获取流。

在客户端,你犯了同样的错误。您希望响应主体是商家的 数组 ,以填充下拉列表 列表 。但是您使用的是 Observable<Merchant>。你需要一个 Observable<Array<Merchant>>。将一个空的选项对象传递给 get() 是没用的:

getList(): Observable<Array<Merchant>> {
  return this.http.get<Array<Merchant>>(environment.api.urls.merchants.base);
}

最后,您通过创建 class 自欺欺人。 HttpClient 永远不会创建您的 class 的实例。它对此一无所知,只是将接收到的 JSON 解析为普通的旧 JavaScript 对象。所以你真的应该定义一个接口,而不是 class:

export interface Merchant {
  id: string;
  name: string;
  state_raw: string;
  users: string;
}

你真的应该也使用 Spring-data-jpa。它会大大简化您的存储库。