当前位置: 首页 > 知识库问答 >
问题:

Spring REST:注入HttpServletRequest会导致模糊的映射异常

吕高寒
2023-03-14

将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.

这是Spring的错误吗?我做错了吗?我几乎可以肯定地通过消除过程跟踪它到HttpServletRequest注入,而不是@Request estParamJSON(一种自动反序列化json超文本传输协议参数的自定义注释),并注意到没有注入方法参数的其他方法可以按预期工作。

编辑:版本:

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。

共有2个答案

楚浩然
2023-03-14

我相信我知道答案。我认为这是因为我在使用groovy,并且在参数中使用了一些默认值。

我相信这会使groovy自动创建具有相同注释映射的多个方法签名。

然后,在启动时,请求映射会发生冲突,从而导致不透明的崩溃。

在上面的示例中,async=false默认值是导致错误的原因

颜河
2023-03-14

你有没有照顾过

ServletiInputStream在读取一次后丢失

问题。Http Servlet请求在读取一次后从POST正文中丢失参数

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/util/ContentCachingRequestWrapper.html

 类似资料:
  • 我有一个带有两个endpoint的spring控制器,当访问它们时,它们会返回任意方法异常。我试图使用HeaderContentNegotiationStrategy来区分它们,它查看传入请求的Accept标头,以确定将请求映射到哪个方法。据我所知,这种策略应该将传入的accept头与products符号进行比较。在我的情况下,这两种方法都会生成一个应用程序/json媒体类型,但是Spring还允

  • 我正在尝试使用spring Boot运行一个web应用程序。 将密码映射为硬编码值。 我的问题是:当应用程序运行并且在主类上使用注释时,只要它命中URL就会发生以下异常: javax.servlet.ServletException:在org.springframework.web.servlet.dispatcherservlet.render(dispatcherservlet.java:13

  • 问题内容: 我正在使用ejb 3并尝试@Inject HttpServletRequest,但是在部署时发生异常。 码: 例外: 我该怎么办? 问题答案: HttpServletRequest的生命周期由EJB / Web容器而不是CDI容器管理。尝试注入它会导致问题,因为通常会有很多接口实现,并且您的CDI容器没有足够的信息来决定要注入哪种实现。即使您成功注入了它的实例,它也 不会 与EJB容器

  • 我是修改Minecraft的初学者,希望修改最新版本的Minecraft锻造版(v1.17.1)。我知道如何为1.16.5设置gradle项目,并且在很大程度上可以为1.17.1设置gradle项目。问题是我不知道Forge 1.17.1的模糊映射是什么。我需要知道,以便为构建的第34行设置正确的映射。格拉德尔:

  • 我正在尝试实现View.OnClickListener接口和GoogleApiclient如下 但这失败了,错误如下 错误:任务': app: dexDebug'执行失败。com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException: Process'命令'C:\Program F

  • 在spring boot应用程序中,当将一个对象索引到es中时,我会遇到以下异常。 这个类有两个静态字段和两个类型为的实例变量,还有一个视图方法,其中一个是被重写的toString。 映射如下。没有映射,索引就可以正常工作。但是,由于对象可以为null,因此需要配置null_值。 我试图将替换为,但是,文档声明:“一个字符串值,它被展平对象字段中的任何显式空值替换。默认值为null,这意味着空si