gpt4 book ai didi

java - 使用 RequestBody 注释时的模糊映射

转载 作者:行者123 更新时间:2023-11-30 10:31:50 24 4
gpt4 key购买 nike

我试图在 Spring Boot 中创建一个端点,它接受单个对象或这些对象的数组。我知道映射需要具有唯一签名,所以我想知道使用 POJO 使其工作的正确方法是什么?

@RequestMapping(method = { RequestMethod.POST })
public ResponseEntity<String> postSingleFoo(HttpServletRequest request,
@RequestBody(required = true) Foo foo) {
// process
}

@RequestMapping(method = { RequestMethod.POST })
public ResponseEntity<String> postMultiFoo(HttpServletRequest request,
@RequestBody(required = true) Foo[] foo) {
// process
}

显然,我遇到了不明确映射的异常。但我仍然想在我的 @RequestBody 注释中使用 POJO,因为我在其中执行了几次转换。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'fooController' method 
public void com.usquared.icecream.lrs.controller.FooController.postSingleFoo(javax.servlet.http.HttpServletRequest,java.lang.String)
to {[/foo],methods=[POST]}: There is already 'fooController' bean method

正确实现此类功能的推荐方法是什么?

最佳答案

这不是可以通过 Spring MVC 解决的问题。 Spring MVC 从注释您的处理程序方法的 @RequestMapping 创建映射。这些有助于区分 Spring MVC 如何委托(delegate)由您的方法处理的 HTTP 请求。您当前的配置尝试将两个处理程序方法映射到相同的请求详细信息。那永远行不通。

假设您需要 JSON 并使用 Jackson,一个解决方案是将您的 ObjectMapper 配置为 accept single values as arrays并定义一个带有数组参数的处理程序方法。例如,您将只保留此处理程序方法

@RequestMapping(method = { RequestMethod.POST })
public ResponseEntity<String> postMultiFoo(HttpServletRequest request,
@RequestBody(required = true) Foo[] foo) {
// process
}

但是这样配置你的ObjectMapper

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

配置取决于您的应用程序的配置方式。使用 Spring Boot,它应该像为 ObjectMapper 声明一个 @Bean 方法一样简单。对于典型的 Spring MVC 应用程序,您需要使用自定义 ObjectMapper 注册一个 MappingJackson2HttpMessageConverter

如果你的JSON,请求体,包含

{
"someProperty":"whatever"
}

Jackson 能够将单个值包装到 Foo[] 中,而 Spring MVC 会将其作为参数传递给您的处理程序方法。然后您可以检查数组的长度并采取相应的行动。

关于java - 使用 RequestBody 注释时的模糊映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42980022/

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