【问题标题】:Spring controller is not supporting ServerHttpRequestSpring 控制器不支持 ServerHttpRequest
【发布时间】:2019-10-12 16:16:04
【问题描述】:

我在我的 Rest Controller 中使用 ServerHttpRequest 作为请求参数。但在响应中,我收到错误消息“No primary or default constructor found for interface org.springframework.http.server.reactive.ServerHttpRequest”。

我找到了一个类似的question,但没有运气。

休息控制器

@GetMapping(path = "/**") public Mono &ltResponseEntity&lt String&gt&gt clientRequests(ServerHttpRequest request) { 单声道&ltResponseEntity&ltString&gt&gt jsonOp = restServices.getApiResponse(); 返回 jsonOp; }

日志

严重:servlet [dispatcherServlet] 的 Servlet.service() 在路径 [] 的上下文中抛出异常 [请求处理失败;嵌套异常是 java.lang.IllegalStateException: No primary or default constructor found for interface org.springframework.http.server.reactive.ServerHttpRequest] 根本原因 java.lang.NoSuchMethodException: org.springframework.http.server.reactive.ServerHttpRequest.() 在 java.lang.Class.getConstructor0(Class.java:3082) 在 java.lang.Class.getDeclaredConstructor(Class.java:2178) 在 org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:216) 在 org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:84) 在 org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:139) 在 org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:126) 在 org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:166) 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134) 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:634) 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:741) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 在 org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

Pom.xml

&lt依赖关系&gt &lt依赖&gt &ltgroupId&gtorg.springframework.boot&lt/groupId&gt &ltartifactId&gtspring-boot-starter-webflux&lt/artifactId&gt &ltversion&gt${spring-boot.version}&lt/version&gt &lt排除&gt &lt排除&gt &ltgroupId&gtorg.springframework.boot&lt/groupId&gt &ltartifactId&gtspring-boot-starter-logging&lt/artifactId&gt &lt/排除&gt &lt/排除&gt &lt/依赖&gt &lt依赖&gt &ltgroupId&gtorg.springframework.boot&lt/groupId&gt &ltartifactId&gtspring-boot-starter-web&lt/artifactId&gt &ltversion&gt${spring-boot.version}&lt/version&gt &lt排除&gt &lt排除&gt &ltgroupId&gtorg.springframework.boot&lt/groupId&gt &ltartifactId&gtspring-boot-starter-logging&lt/artifactId&gt &lt/排除&gt &lt/排除&gt &lt/依赖&gt &lt依赖&gt &ltgroupId&gtio.projectreactor.netty&lt/groupId&gt &ltartifactId&gtreactor-netty&lt/artifactId&gt &ltversion&gt${reactor-netty.version}&lt/version&gt &lt/依赖&gt &lt/依赖关系&gt

版本:

&ltspring-boot.version&gt2.1.4.RELEASE&lt/spring-boot.version&gt &ltreactor-netty.version&gt0.8.6.RELEASE&lt/reactor-netty.version&gt

【问题讨论】:

  • 请参考question。看起来与您的问题相似。
  • 感谢 Azhar,但我正在导入正确的类 org.springframework.http.server.reactive.ServerHttpRequest;

标签: java spring-boot spring-webflux


【解决方案1】:

正如Spring Boot reference documentation on WebFlux 中所述,添加 web 和 webflux 启动器意味着 Spring Boot 将自动配置 Spring MVC 应用程序。

在这种情况下无法解析此参数类型,因为 Spring MVC 应用程序无法解析此请求类型。

【讨论】:

    【解决方案2】:

    正如@Brian Clozel 所提到的,这可能是由于“Spring WebFlux”和“Spring MVC”框架的共存以及 Spring 在将应用程序配置为基于 servlet 的 Web 应用程序时的自动化行为 (here) 造成的。

    因此,尝试将您的应用程序作为 REACTIVE Web 应用程序运行:

    //以编程方式here

    public static void main(String[] args) {
        SpringApplication springApplication = new SpringApplication(YourApp.class);
        springApplication.setWebApplicationType(WebApplicationType.REACTIVE);
        springApplication.run(args);
    }
    

    //按属性here

    spring.main.web-application-type=REACTIVE
    

    【讨论】:

      猜你喜欢
      • 2019-05-06
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多