【发布时间】:2021-06-21 16:15:58
【问题描述】:
我正在阅读this,这样我可以更好地理解如何处理异步请求,即使我理解他在这里做什么:
.map(processor::responseToDatabaseEntity) // Create a persistable entity from the response
.map(priceRepository::save) // Save the entity to the database
我不知道这两种方法将如何实现。假设这个非常简单的代码:
public Mono<Response> postMethod(String id, Person json) {
return webClient.post().uri(id).body(Mono.just(json), Person.class).retrieve().bodyToMono(Response.class);
}
还有响应类,比如:
public class Response implements Serializable{
private static final long serialVersionUID = -4101206629695985431L;
public String statusCode;
public Date date;
public PersonInfo data;
我假设responseToDatabaseEntity 方法是从对 PersonInfoDTO 的响应到数据库的某种转换,save 将插入其中。但是我怎么能使用可以在.map() 中工作的方法参考(::) 来实现类似的东西,所以我可以订阅()之后是我不明白的。
编辑: 添加我所取得的进展,但或多或少地适应了我在 Person 类中给出的示例:
public Mono<Object> postPerson(String id, Person json) {
return webClient.post().uri(id).body(Mono.just(json), Person.class).retrieve().bodyToMono(Response.class).map( c -> {
List<PersonDTO> list = new ArrayList<PersonDTO>();
c.data.getRoles().forEach((r) -> {
PersonDTO dto = new PersonDTO(c.data.getOof(), "something", c.data.getFoo(), r);
list.add(dto);
});
return list;
}).map(personController::savePerson).subscribe(); //what I wanted to do
}
如果我这样做:
});
return list;
}).map(l -> {
l.
});
l 包含 PersonDTO 列表,如果我这样做:
.map(l -> {
l.forEach( f -> {
f.
});
});
f 包含一个人。
我应该如何实现将整个列表发送到方法中或一个人发送到save的方法。我不能使用像PersonController::savePerson 这样的静态方法,因为:
@RestController
public class PersonController {
private final Logger LOG = LoggerFactory.getLogger(getClass());
@Autowired
private final PersonInterface personRepository;
public PersonController(PersonInterface personRepository) {
this.personRepository = personRepository;
}
personRepository 不能是static。
EDIT2:也试过这个,不行:
public List<PersonDTO> savePerson(List<PersonDTO> list) {
list.forEach(dto -> {
personRepository.save(dto);
});
return list;
}
【问题讨论】:
-
您能否详细说明您不了解的内容?你的假设是正确的。您可以编写一个返回对象的 map 方法,然后最后调用 subscribe()。对于方法参考 - 这应该会有所帮助 - baeldung.com/java-method-references
-
我已经编辑了更多细节的评论。
标签: java spring-boot webclient