在Spring Framework 5.0中:Functional Web Framework如何将newley创建的实体的id放在webflux serverresponse标头中

时间:2018-10-07 05:57:35

标签: spring functional-programming reactive-programming spring-webflux

 public Mono<ServerResponse> post(ServerRequest request) {
   final Mono<Person> person = request.bodyToMono(Person.class);
   final String id = ????; //replace this with newly inserted //objects id
   return created(UriComponentsBuilder.fromPath("people/" + 
   id).build().toUri())
        .contentType(APPLICATION_JSON)
        .body(
                fromPublisher(
                        person.map(p -> new Person(p, 
       id)).flatMap(personManager::save), Person.class));
 }

在这里,我试图将实体发布到要创建的服务器上。我需要将新创建的对象的ID插入到响应的位置标头中。

1 个答案:

答案 0 :(得分:0)

在kotlin中执行我的项目之后,您可以编写如下代码:

   @Configuration
    class ResumeRoute {

        @Bean
        fun resumeRoutes(@Value("\${baseServer:http://localhost:8080}") baseServer: String, resumeRepository: ResumeRepository) = router {

        POST("/resume")
        {


   it.principal().flatMap {
            resumeRepository.save(Resume.emptyResume(UUID.randomUUID().toString(), it.name, Language.EN)).toMono()
        }.flatMap { created(URI("${baseServer}/resume/${it.id}")).build() }
    }

}

}

即使这是kotlin而非Java版本,这里重要的是,您应该先拥有实体才能获取ID,然后使用它来创建服务器响应

因此,您的代码应如下所示:

public Mono<ServerResponse> post(ServerRequest request) {
    return request.bodyToMono(Person.class)
            .map(personManager::save)
            .flatMap(savedPerson ->
                    created((UriComponentsBuilder.fromPath("people/" + savedPerson.getId()).build().toUri()))
                            .body(fromObject(savedPerson)));
}

我希望这可以为您提供帮助