【发布时间】:2021-12-31 02:00:01
【问题描述】:
我有一个带有几个端点的 Web 服务,其中一个是 PUT 端点,它接收 XML 并向 Redis 服务器添加一些信息。
我的端点被映射到一个配置类中:
@Configuration
public class RouterConfig {
@Autowired
private YAMLConfig yamlConfig;
@Bean
public RouterFunction<ServerResponse> getRoutes(final ServiceHandler serviceHandler) {
return RouterFunctions.route()
.GET(yamlConfig.getEnvPrefix() + STATUS_ENDPOINT, serviceHandler::getStatus)
.GET(yamlConfig.getEnvPrefix() + STOCK_CAP_API + PRODUCT_CAPPING_ENDPOINT, serviceHandler::getStockCapForProducts)
.PUT(yamlConfig.getEnvPrefix() + STOCK_CAP_API + ADD_PRODUCT_CAP_FOR_CUSTOMER, RequestPredicates.contentType(MediaType.APPLICATION_XML), serviceHandler::AddStockCap)
.build();
}
}
PUT 端点的处理程序方法如下所示:
@NonNull
public Mono<ServerResponse> AddStockCap(ServerRequest serverRequest) {
log.info("Adding new stock caps");
serverRequest.bodyToMono(CustomerCap.class)
.flatMap(stockCapService::addCustomerStockCap)
.doOnEach(result -> System.out.println("Cap added - " + result));
return ServerResponse.ok().build();
}
bodyToMono 被映射到一个表示 XML 有效负载的类,如下所示,并且该类中的属性 Customer 也以相同的方式映射到一个类。
@XmlRootElement(name="customerCap")
@XmlAccessorType(XmlAccessType.FIELD)
public class CustomerCap {
@XmlElement
private List<Customer> customer;
public List<Customer> getCustomer() {
return customer;
}
public void setCustomer(List<Customer> customer) {
this.customer = customer;
}
}
addCustomerStockCap 的实现是
@Override
public Mono<Boolean> addCustomerStockCap(CustomerCap customerCap) {
log.info("Starting adding process");
customerCap.getCustomer().forEach(customer -> {
final var customerUID = customer.getCustomerNumber();
customer.getCap().forEach(cap -> {
redisCommands.hset(String.join(SEP, STOCK_CAP, customerUID, cap.getMaterialNumber()), CAP_LIMIT, String.valueOf(cap.getCustomerCapLimit()));
redisCommands.hset(String.join(SEP, STOCK_CAP, customerUID, cap.getMaterialNumber()), VALID_FROM, String.valueOf(cap.getCapValidFrom()));
redisCommands.hset(String.join(SEP, STOCK_CAP, customerUID, cap.getMaterialNumber()), VALID_TO, String.valueOf(cap.getCapValidTo()));
setExpirationOnHash(customerUID, cap);
});
});
return Mono.just(Boolean.TRUE);
}
处理端点的方法被正确调用,我可以在日志上看到“Addin new stock caps”消息,但是addCustomerStockCap从未被调用,没有抛出异常或错误,该方法根本不执行。
我做的另一个测试是创建一个控制器而不是一个功能端点。控制器方法最终是这样的
@PutMapping(STOCK_CAP_API + ADD_PRODUCT_CAP_FOR_CUSTOMER)
@ResponseStatus(HttpStatus.OK)
public void AddStockCap(@RequestBody CustomerCap customerCap) {
log.info("Adding new stock caps");;
stockCapService.addCustomerStockCap(customerCap);
}
当我这样做时,我在 XML 解析中遇到了一些错误,我只修复了将注释 @NoArgsConstructor 添加到 CustomerCap 和其他元素类。在此修复后,控制器/端点按预期工作。
问题仍然是我需要让它在功能端点上工作,我们有几个应用程序并且我们使用功能端点作为我们的标准,所以像这样只留下这个端点是没有意义的。
【问题讨论】:
标签: spring-boot spring-webflux