java - Spring Controller 不支持ServerHttpRequest

标签 java spring-boot spring-webflux

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

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

休息 Controller

@GetMapping(path = "/**")
public Mono <ResponseEntity< String>> clientRequests(ServerHttpRequest request) {
    Mono<ResponseEntity<String>> jsonOp =  restServices.getApiResponse();
    return jsonOp;
}

日志


SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No primary or default constructor found for interface org.springframework.http.server.reactive.ServerHttpRequest] with root cause
java.lang.NoSuchMethodException: org.springframework.http.server.reactive.ServerHttpRequest.()
    at java.lang.Class.getConstructor0(Class.java:3082)
    at java.lang.Class.getDeclaredConstructor(Class.java:2178)
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:216)
    at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:84)
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:139)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:126)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:166)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:134)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:897)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

    

Pom.xml


<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
            <version>${spring-boot.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>${spring-boot.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>io.projectreactor.netty</groupId>
            <artifactId>reactor-netty</artifactId>
            <version>${reactor-netty.version}</version>
        </dependency>
    </dependencies>

版本:


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

最佳答案

正如 @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

关于java - Spring Controller 不支持ServerHttpRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56320109/

相关文章:

java - 使用jsp以表格格式显示csv文件数据

java - 在java字符串中用\u替换\\u

spring - 通过自己的域访问时,POST API 无法在 Heroku 上运行

kotlin - 如何将 Reactor Flux<String> 转换为 InputStream

Java 使用 Webflux 在 Springboot 中将 FilePart 转换为 byte[]

java - 通量处理器 : retrieve last emitted value on subscribe like rx's Subject

java - 如何将 SWT_XYGraph_2.1.0 小部件安装到 Eclipse 中

java - JPA - 如何将观察者模式应用于实体?

angularjs - 如果在 STS 之外更改,Spring boot web main/resources/static 不会重新加载

java - spring boot 应用程序在进行单元测试时是否需要连接数据库