9

我有一个在 Tomcat 中运行并使用 Spring MVC 定义控制器和映射的 Web 应用程序。我有以下课程:

@Controller("api.test")
public class TestController {

        @RequestMapping(value = "/test", method = RequestMethod.GET)   
        public @ResponseBody String test(HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
            // body
        }
}

我想根据某处定义的属性(例如文件)使这个控制器和“.../test”路径可用。如果该属性是假的,我希望应用程序表现得好像该路径不存在,如果它是真的,则表现正常。我怎样才能做到这一点?谢谢。

4

2 回答 2

15

如果您使用的是 Spring 3.1+,请使控制器仅在测试配置文件中可用:

@Profile("test")
class TestController {
    ...
}

然后通过例如在 Tomcat 启动时传递以下系统属性来启用该配置文件:

-Dspring.profiles.active=test

要禁用控制器,只需省略给定的配置文件。

于 2013-06-13T05:53:28.323 回答
5

另一种方法,可能是更简单的方法,是将@ConditionalOnProperty注释与您的 RestController/Controller 一起使用。

    @RestController("api.test")
    @ConditionalOnProperty(name = "testcontroller.enabled", havingValue = "true")
public class TestController {

        @RequestMapping(value = "/test", method = RequestMethod.GET)   
        public String test(HttpServletRequest httpRequest, HttpServletResponse httpResponse) {
            // body
        }
}

这里 yml 属性中的 testcontroller.enabled 属性说,如果未设置为 true ,则永远不会创建 TestController Bean。

提示:我建议您使用 RestController 而不是 Controller,因为它默认添加了 @ResponseBody。您可以使用 @ConditionalOnExpression 来获得相同的解决方案,但由于 SpEL 评估而速度稍慢。

于 2016-06-28T18:49:04.713 回答