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

运行Spring WebFlux@controller而不

江德润
2023-03-14

我正在尝试在没有Spring Boot的情况下从main启动Spring应用程序,我设法获得了工作的路由器功能,但无法使其工作到经典的@控制器。我调试并观看了启动的源代码,内置了配置,添加了RequestMappingHandlerMapping,它注册了我的控制器,但无论如何WebHandler都看不到它。我可以看到spring发现我的@控制器是一个bean,所以这不是问题。有人能帮帮我吗?谢谢。

2018年4月13日7:27:30 PM org.springframework.context.support.abstractApplicationContext准备刷新信息:刷新org.springframework.context.annotation.annotationConfigApplicationContext@20e2cbe0:启动日期[Fri Apr 13 19:27:30 EEST 2018];上下文层次结构的根目录2018年4月13日7:27:31 PM org.SpringFramework.web.reactive.result.method.AbstractHandlerMethodMapping$MappingRegistry注册信息:将“{[/test],methods=[GET]}”映射到公共java.lang.String test.wboot.controller.test()[DEBUG](main)使用控制台日志[DEBUG](main)默认Epoll支持:false[DEBUG](main)默认KQueue支持

public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        context.start();
    }
}

.

@Configuration
@ComponentScan("test.wboot")
public class AppConfig {

    public static final int port = 9099;

    @Bean
    public NettyContext servak(ApplicationContext applicationContext) throws IOException {


//        this handler works just perfect
//        HttpHandler httpHandler = RouterFunctions.toHttpHandler(routingFunction());

//        And this one can not see Controller
        HttpHandler httpHandler = WebHttpHandlerBuilder.applicationContext(applicationContext).build();

        ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler);
        NettyContext localhost = HttpServer.create("localhost", port).newHandler(adapter).block();
        System.out.println("Press button to exit");
        System.in.read();
        return localhost;
    }

    public RouterFunction<ServerResponse> routingFunction() {
        return nest(path("/test"), route(GET(""), new HandlerFunction<ServerResponse>() {
            public Mono<ServerResponse> handle(ServerRequest request) {
                return ServerResponse.ok().syncBody("Hello yopta");
            }
        }));
    }

    @Bean
    public RequestMappingHandlerMapping requestMappingHandlerMapping(ApplicationContext applicationContext) {
        RequestMappingHandlerMapping requestMappingHandlerMapping = new RequestMappingHandlerMapping();
        requestMappingHandlerMapping.setApplicationContext(applicationContext);
        requestMappingHandlerMapping.afterPropertiesSet();
        return requestMappingHandlerMapping;
    }

    @Bean
    public WebHandler webHandler(ApplicationContext applicationContext) {
        DispatcherHandler webHandler = new DispatcherHandler();
        webHandler.setApplicationContext(applicationContext);
        return webHandler;
    }
}

.

@RestController
@RequestMapping("/test")
public class Controller {

    @GetMapping
    public String test() {
        return "work";
    }
}

Maven依赖项:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webflux</artifactId>
        <version>5.0.5.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.5.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>io.projectreactor.ipc</groupId>
        <artifactId>reactor-netty</artifactId>
        <version>0.7.6.RELEASE</version>
    </dependency>
</dependencies>

共有1个答案

陆宏扬
2023-03-14

你为什么要重新拨号?Spring Framework提供了一个@enablewebflux注释,它可以完成以上功能,因此您只需在@configuration类上添加该注释即可。

然后,您只需按照这里的说明,使用框架自动创建的webhandler启动服务器;对于Reactor Netty来说,这看起来像:

HttpHandler handler = ...
ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler);
HttpServer.create(host, port).newHandler(adapter).block();
 类似资料:
  • 我发现可以使用属性启用/禁用spring boot@RestController吗?它解决了在引导时不启动@控制器的问题,但我正在寻找一种在运行时停止@控制器的方法。

  • 问题内容: 我有一种需要动态更改控制器的情况,以便相应地影响范围变量。总体结构: 我在这里看到它可以在一个。可以在外面做吗?换句话说,我可以告诉angular将其读取为变量而不是字符串文字吗? 问题答案: 正如评论中所讨论的那样,具有用于处理这些情况的强大 功能/库 - (具有强大的 Wiki ) 。 这是需要开发功能块- 状态 的答案,而不是在视图/ URL中进行思考 (从首页引用) : Ang

  • 问题内容: 由于提问和回答在这里,Python已经部署的没有安装一个有用的方法。Java可以做同样的事情吗? 有什么方法可以在不安装jre的情况下运行Java的jar文件? 是否有类似java2exe(win32),java2bin(linux)或java2app(mac)的工具? 问题答案: 您可以为此使用Launch4j。有据可查且易于使用。尽管生成的程序仍需要运行JRE,但您不必在目标系统上

  • 在什么情况下Spring webflow会进行订阅?我在任何地方都读到必须有订阅,否则不会发生任何更改。在我使用Spring Webflow的短暂时间里,我从未在控制器或服务中见过。 我的疑问还在于,在使用flatMap时,。。。等订阅在什么时候进行? 我所读的并不能真正解决我的疑虑。 我知道这是一个异步问题,但每个flatMap都同时运行?。。。所以有时候我注意到一些数据是空的。

  • 我创建了一个测试项目(maven)来测试REST API的性能。我正在使用Jeter插件 这是我的pom片段 我有一个Jenkins文件在我的项目像这样 当我触发Jenkins上的构建时,构建成功了,我在控制台输出中看到了这一点 问题是,它什么也做不了。Performace趋势图没有显示任何东西。 如果我在本地机器上运行相同的项目,它工作得非常好。我在日志中看到类似的东西,证实了这一点。生成的输出