我正在尝试在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
正确实施此功能的推荐方法是什么?
答案 0 :(得分:1)
这不是可以通过Spring MVC修复的问题。 Spring MVC从@RequestMapping
注释处理程序方法创建映射。这些有助于区分Spring MVC如何委托您的方法处理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,它应该像为@Bean
声明ObjectMapper
方法一样简单。使用典型的Spring MVC应用程序,您需要使用自定义MappingJackson2HttpMessageConverter
注册ObjectMapper
。
如果您的JSON(请求正文)包含
{
"someProperty":"whatever"
}
Jackson能够将单个值包装到Foo[]
中,而Spring MVC会将其作为参数传递给您的处理程序方法。然后,您可以检查阵列的长度并采取相应的行动。