仍在玩耍,并试图了解Spring的Webflux和Reactor的“方式”。

当使用带注释的控制器时(例如,在// localhost:8080 / v1 / DemoPOJO发出的POST),以下代码成功地将新的DemoPOJO添加到了仓库中。

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

我正在“为此工作”,但我想知道是否有人可以帮助我“更快到达那里”。无论如何,不​​需要从ServerRequest中获取DemoPOJO的路由器/处理程序实现(即GET)正在工作。

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());


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

10-05 22:09