我读这篇文章是为了更好地理解如何处理异步请求,尽管我理解他在这里做什么:
.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
方法是从Response-to-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
。
编辑2:也尝试过这个,不起作用:
public List<PersonDTO> savePerson(List<PersonDTO> list) {
list.forEach(dto -> {
personRepository.save(dto);
});
return list;
}
您可以在任何类中编写responseToDatabaseEntity
方法-您可以创建一个处理器或专用转换器,它能够将Entity转换为Data Objects和Vice Versa。
在响应流实例上调用的Map函数将接受对任何方法的引用,该方法接受响应实例的单个参数并返回任何类型的对象。
例如,我创建了一个专用的变压器
public class EntityDtoTransformer{
public EntityObject responseToDatabaseEntity(Response response){
...
...
return entity;
}
}
你可以在地图功能中参考这种方法,比如:
entityDtoTransformerInstance::responseToDatabaseEntity
此外,您可以使此方法为静态,然后在映射函数中使用它作为
EntityDtoTransformer::responseToDatabaseEntity
如果你的transformer方法是响应类的一部分,你可以
.map(res -> response.responseToDatabaseEntity)
或短格式
.map(Response::responseToDatabaseEntity)