首页 > 解决方案 > Spring 控制器不支持 ServerHttpRequest

问题描述

我在我的 Rest Controller 中使用 ServerHttpRequest 作为请求参数。但在响应中,我收到错误消息“没有为接口 org.springframework.http.server.reactive.ServerHttpRequest 找到主要或默认构造函数”。

我发现了一个类似的问题,但没有运气。

休息控制器

@GetMapping(路径 = "/**")
公共 Mono <ResponseEntity< String>> clientRequests(ServerHttpRequest request) {
    Mono<ResponseEntity<String>> 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

<依赖项>
        <依赖>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
            <version>${spring-boot.version}</version>
            <排除>
                <排除>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </排除>
            </排除>
        </依赖>
        <依赖>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
            <排除>
                <排除>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </排除>
            </排除>
        </依赖>

        <依赖>
            <groupId>io.projectreactor.netty</groupId>
            <artifactId>reactor-netty</artifactId>
            <version>${reactor-netty.version}</version>
        </依赖>
    </依赖>

版本:

    <spring-boot.version>2.1.4.RELEASE</spring-boot.version>
    <reactor-netty.version>0.8.6.RELEASE</reactor-netty.version>

标签: javaspring-bootspring-webflux

解决方案


正如 WebFlux 上的Spring Boot 参考文档中所解释的,添加 web 和 webflux 启动器意味着 Spring Boot 将自动配置 Spring MVC 应用程序。

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


推荐阅读