剩余结果为空 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 void
。 void
什么都不是,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。它会大大简化您的存储库。
我想创建一个服务,以便从数据库中填充下拉列表。我试过这个:
商家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 void
。 void
什么都不是,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。它会大大简化您的存储库。