有没有办法刷新RequestMappingHandlerMapping?

时间:2017-12-12 23:22:24

标签: spring spring-boot spring-restcontroller

我正在开发一个Spring Boot应用程序 - 并在RequestMapping已经初始化之后添加@RestController bean。
我可以看到新的Controller bean在Web上下文中,但由于它们之后被添加,因此在应用程序完成启动时没有映射。

我希望我可以在RequestMappingHandlerMapping上调用“afterPropertiesSet()”,但最终会出现模糊的映射[我假设调用该方法会重新注册所有带映射的bean]

有没有办法注册某些bean,或刷新RequestMappingHandlerMapping?

Caused by: java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path 'http://localhost:52765/error': {public org.springframework.http.ResponseEntity org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest), public org.springframework.http.ResponseEntity org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)}
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lookupHandlerMethod(AbstractHandlerMethodMapping.java:367) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:314) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.getHandlerInternal(AbstractHandlerMethodMapping.java:61) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
    at org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler(AbstractHandlerMapping.java:352) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.getHandler(DispatcherServlet.java:1160) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:940) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) ~[spring-webmvc-4.3.10.RELEASE.jar:4.3.10.RELEASE]
    ... 26 common frames omitted  

问另一种方式 -

我在一个单独的项目中有一个@RestController,配置项目没有引用它 我有第三个项目,它使用@RestController引用配置项目和'module'项目。

在配置RequestMappingHandlerMapping之前,如何确保模块项目中的@RestController被添加到应用程序上下文中?

我创建了一个自定义注释,想想也许我可以以某种方式使用它..看到这里的项目 -
主要平台 - https://github.com/savantly-net/sprout-platform/tree/development/

自动配置项目 - https://github.com/savantly-net/sprout-platform/tree/development/spring/sprout-spring-boot-starter

模块项目 - https://github.com/savantly-net/sprout-platform/tree/development/modules/sprout-wiki-module

完整网络项目 - https://github.com/savantly-net/garden/tree/development

如果构建此项目,您将看到将wiki模块bean添加到应用程序上下文中,但永远不会映射@RestController。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我将Web应用程序中的模块声明从@Bean更改为@Import,并解决了该问题。我假设这会增加模块项目中bean的顺序。

之前 -

@SpringBootApplication
public class GardenWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(GardenWebApplication.class, args);
    }

    @Bean
    public WikiModule wikiModule() {
        return new WikiModule();
    }
}

之后 -

@SpringBootApplication
@Import(WikiModule.class)
public class GardenWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(GardenWebApplication.class, args);
    }
}