将 HttpServletRequest 或 HttpServletResponse 注入@RestController类中的 @RequestMapping 方法会导致异常(至少在启用注释的@SpringBootTest测试中(:
@RequestMapping(value = '/doc/{collection}/{id}/{attr}/', method = RequestMethod.POST)
void updateAttr(
@PathVariable(value = 'collection', required = true) String collection,
@PathVariable(value = 'id', required = true) String uuid,
@PathVariable(value = 'attr', required = true) String attr,
@RequestParam(value = 'async', required = false) Boolean async = false,
@RequestParamJSON(value = 'detail', required = false) Detail customDetailJSON,
HttpServletRequest request
) {
错误:
Caused by: 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 'apiController' method
public void ControllerClass.updateAttr(java.lang.String,java.lang.String,java.lang.String,java.lang.Boolean,cassdoc.Detail,javax.servlet.http.HttpServletRequest)
to {[/doc/{collection}/{id}/{attr}/],methods=[POST]}: There is already 'controllerClass' bean method
public void ControllerClass.updateAttr(java.lang.String,java.lang.String,java.lang.String,cassdoc.Detail,javax.servlet.http.HttpServletRequest) mapped.
这是春天的虫子吗?我做错了吗?我几乎已经明确地将其追溯到 HttpServletRequest 注入,而不是@RequestParamJSON通过消除过程自动反序列化 http 参数的自定义注释(一种自定义注释,它自动反序列化 http 参数是 json(,并注意到没有注入 HttpRequest 或 HttpResponse 的其他方法按预期工作。
编辑:版本:
compile group: 'org.springframework', name: 'spring-web', version: '4.3.8.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-configuration-processor', version: '1.5.3.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '1.5.3.RELEASE'
compile group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.3.RELEASE'
哦,我认为这并不重要,但我使用的是 groovy 而不是 java。
你有没有照顾好
ServletInputStream 在读取一次后丢失
问题。Http Servlet 请求在读取一次后会丢失 POST 正文中的参数
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/util/ContentCachingRequestWrapper.html
我知道答案。我认为这是因为我在参数中使用了 groovy 并使用了一些默认值。
我相信这使得 groovy 自动创建具有相同注释映射的多个方法签名。
然后,这会不透明地破坏启动时发生冲突的请求映射。
在上面的例子中,async = false defaulting是导致错误的原因