gpt4 book ai didi

java - Rest api 的结果为空

转载 作者:行者123 更新时间:2023-12-02 01:49:55 28 4
gpt4 key购买 nike

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

商户类别:

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。

最佳答案

双方都存在一些问题。让我们从服务器端开始。您想要返回商家列表来填充下拉列表列表,因此您正确地将方法命名为 getMerchantsList()。但它并没有像其名称所示返回列表,而是返回 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()得到一个流。

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

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

最后,创建一个类是在欺骗自己。 HttpClient 永远不会创建您的类的实例。它不知道这一点,只是将收到的 JSON 解析为普通的旧 JavaScript 对象。所以你应该真正定义一个接口(interface),而不是一个类:

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

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

关于java - Rest api 的结果为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53130108/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com