gpt4 book ai didi

java - Spring 带注释的 Controller 可以工作,但路由器/处理程序方法似乎无法从 *ServerRequest* 检索 *Mono<>*

转载 作者:行者123 更新时间:2023-12-02 02:38:55 26 4
gpt4 key购买 nike

仍在尝试并尝试了解 Spring 的 Webflux 和 Reactor 的“原理”。

当使用带注释的 Controller 时,以下内容成功将新的 DemoPOJO 添加到存储库(即,在 //localhost:8080/v1/发出 POST演示POJO)。

但是,当使用路由器/处理程序实现(即//localhost:8080/v2/DemoPOJO)发出相同的POST时,request.bodyToMono (DemoPOJO.class) 似乎没有从 ServerRequest 检索 DemoPOJO 实例(即 DemoPOJO.printme() 是没有被调用)。

我正在“努力解决这个问题”,但我想看看是否有人可以帮助我“更快地到达那里”。就其值(value)而言,路由器/处理程序实现(即 GET)不需要从 ServerRequest 中获取 DemoPOJO正在工作。

使用注释的 RESTful 端点...

@RestController
public class DemoPOJOController {

private Logger logger = LoggerFactory.getLogger(DemoPOJOHandler.class);

@Autowired
DemoPOJOService service;

@RequestMapping(method = POST, value = "/v1/DemoPOJO")
public Mono<Boolean> addDemoPOJO(@RequestBody DemoPOJO demoPOJO) {
logger.debug("DemoPOJOController.addDemoPOJO( {} )", demoPOJO.getId());
return service.add(demoPOJO);
}
}

相应路由器/处理程序实现的“路由器”部分...

@Configuration
public class DemoPOJORouter {

private Logger logger = LoggerFactory.getLogger(DemoPOJOHandler.class);

@Bean
public RouterFunction<ServerResponse> route(DemoPOJOHandler requestHandler) {
logger.debug("DemoPOJORouter.route( DemoPOJOHandler )");
return nest(path("/v2"),
nest(accept(APPLICATION_JSON),
RouterFunctions.route(RequestPredicates.POST("/DemoPOJO"), requestHandler::add)));
}
}

路由器/处理程序实现的“处理程序”部分...

@Component
public class DemoPOJOHandler {

public static final String PATH_VAR_ID = "id";

private Logger logger = LoggerFactory.getLogger(DemoPOJOHandler.class);

@Autowired
private DemoPOJOService service;

public Mono<ServerResponse> add(ServerRequest request) {
logger.debug("DemoPOJOHandler.add( ServerRequest )");

request.bodyToMono(DemoPOJO.class).doOnSuccess(DemoPOJO::printMe);
return ServerResponse.ok().build();
}
}

DemoPOJORepo 实现(希望通过避免“真实”存储库来简化我的学习体验)...

@Component
public class DemoPOJORepo {

private static final int NUM_OBJS = 15;

private Logger logger = LoggerFactory.getLogger(DemoPOJORepo.class);

private static DemoPOJORepo demoRepo = null;

private Map<Integer, DemoPOJO> demoPOJOMap;

private DemoPOJORepo() {
logger.debug("DemoPOJORepo.DemoPOJORepo()");
initMap();
}

public boolean add(DemoPOJO demoPOJO) {
logger.debug("DemoPOJORepo.add( DemoPOJO )");
boolean pojoAdded = false;

if (!demoPOJOMap.containsKey(demoPOJO.getId())) {
logger.debug("DemoPOJORepo.add( DemoPOJO ) -> adding for id {}", demoPOJO.getId());
demoPOJOMap.put(demoPOJO.getId(), demoPOJO);
pojoAdded = true;
}
return pojoAdded;
}

private void initMap() {
logger.debug("DemoPOJORepo.initMap()");
demoPOJOMap = new TreeMap<Integer, DemoPOJO>();

for (int ndx = 1; ndx < (NUM_OBJS + 1); ndx++) {
demoPOJOMap.put(ndx, new DemoPOJO(ndx, "foo_" + ndx, ndx + 100));
}
}
}

被操纵的对象...

public class DemoPOJO {

private Logger logger = LoggerFactory.getLogger(DemoPOJOHandler.class);

public static final String DEF_NAME = "DEFAULT NAME";
public static final int DEF_VALUE = 99;

private int id;
private String name;
private int value;

public DemoPOJO(int id) {
this(id, DEF_NAME, DEF_VALUE);
}

public DemoPOJO(@JsonProperty("id") int id, @JsonProperty("name") String name, @JsonProperty("value") int value) {
logger.debug("DemoPOJO.DemoPOJO( {}, {}, {} )", id, name, value);
this.id = id;
this.name = name;
this.value = value;
}

// getters and setters go here

public void printMe() {
logger.debug("DemoPOJO.printMe()");
System.out.printf("id->%d, name->%s, value->%d%n", id, name, value);
}
}

最佳答案

我在这里猜测,因为我是通过手机写作的。但我认为这是你的问题。

request.bodyToMono(DemoPOJO.class).doOnSuccess(DemoPOJO::printMe);
return ServerResponse.ok().build();

您认为势在必行,第一行将被执行,然后是第二行,这在 webflux 中不是这种情况。你必须考虑事件回调。

return request.bodyToMono(DemoPOJO.class)
.doOnSuccess(DemoPOJO::printMe)
.thenReturn(ServerResponse.ok().build());

我认为就是这样,但我可能是错的。

关于java - Spring 带注释的 Controller 可以工作,但路由器/处理程序方法似乎无法从 *ServerRequest* 检索 *Mono<>*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57191885/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com