REST API的结果为空

时间:2018-11-03 09:41:06

标签: java spring spring-boot spring-rest

我想创建一个服务以填充数据库中的下拉列表。我尝试过:

商人阶层:

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中的列表为空。也许我应该返回Iterable<Merchants>而不是ResponseEntity<MerchantDTO>

我使用Java 10。

1 个答案:

答案 0 :(得分:2)

双方都有几个问题。让我们从服务器端开始。您想返回商家的列表来填充下拉列表 list ,因此您已正确命名方法getMerchants List ()。但是,它没有返回名称所指示的 list ,而是返回voidvoid没什么,纳达,因此是空洞的回应。

因此,您需要返回一个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()方法返回一个List而不是Iterable,则代码将更简单。您可以只使用findAll().stream()来获取流。

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

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

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

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

您也应该真正使用Spring-data-jpa。这样可以大大简化您的存储库。