问题描述
我正在阅读 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
方法是从 Response 到 PersonInfoDTO 到数据库的某种转换,save
将插入其中。但是我怎么能使用 Method Reference(::) 实现类似的东西,它可以在 .map()
中工作,所以我可以订阅()之后是我不明白的。
编辑: 添加我的进度,但或多或少地适应了我在 Person 类中给出的示例:
public Mono<Object> postPerson(String id,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;
}
解决方法
您可以在任何类中编写 responseToDatabaseEntity
方法 - 您可以创建一个处理器或一个能够转换 Entity to Data Objects 的专用转换器,反之亦然。
在响应流实例上调用的 Map 函数将接受对任何采用 Response 实例的单个参数并返回任何类型的对象的方法的引用。
因此,例如我创建了一个专用转换器
public class EntityDtoTransformer{
public EntityObject responseToDatabaseEntity(Response response){
...
...
return entity;
}
}
您可以在 Map 函数中引用此方法,例如:
entityDtoTransformerInstance::responseToDatabaseEntity
此外,您可以将此方法设为静态,然后在地图函数中将其用作
EntityDtoTransformer::responseToDatabaseEntity
如果您的转换器方法是响应类的一部分,您可以
.map(res -> response.responseToDatabaseEntity)
或缩写形式
.map(Response::responseToDatabaseEntity)