我想创建一个服务以填充数据库中的下拉列表。我尝试过:
商人阶层:
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。
答案 0 :(得分:2)
双方都有几个问题。让我们从服务器端开始。您想返回商家的列表来填充下拉列表 list ,因此您已正确命名方法getMerchants List ()。但是,它没有返回名称所指示的 list ,而是返回void
。 void
没什么,纳达,因此是空洞的回应。
因此,您需要返回一个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。这样可以大大简化您的存储库。