是否可以使用属性启用/禁用弹簧启动@RestController?

给定一个带有 ,例如 的“标准”弹簧启动应用程序@RestController

@RestController
@RequestMapping(value = "foo", produces = "application/json;charset=UTF-8")
public class MyController {
    @RequestMapping(value = "bar")
    public ResponseEntity<String> bar(
        return new ResponseEntity<>("Hello world", HttpStatus.OK);
    }
}

是否有一种注释或技术可以阻止端点启动,如果/除非某个应用程序属性存在/不存在。

注: 测试方法内的属性并分解不是解决方案,因为端点将存在。

我不关心粒度:即仅启用/禁用一个方法或整个类都很好。


由于配置文件不是属性,因此通过配置文件进行控制并不能解决我的问题。


答案 1

我找到了一个简单的解决方案:使用:@ConditionalOnExpression

@RestController
@ConditionalOnExpression("${my.controller.enabled:false}")
@RequestMapping(value = "foo", produces = "application/json;charset=UTF-8")
public class MyController {
    @RequestMapping(value = "bar")
    public ResponseEntity<String> bar(
        return new ResponseEntity<>("Hello world", HttpStatus.OK);
    }
}

添加此注释后,除非我有

my.controller.enabled=true

在我的文件中,控制器根本无法启动。application.properties

您也可以使用更方便的:

@ConditionalOnProperty("my.property")

其行为与上述完全相同;如果该属性存在并且 ,则组件将启动,否则不会启动。"true"


答案 2

在这里添加这个问题和另一个问题

这是我的答案:

我实际上会使用bean@RefreshScope,然后当您想在运行时停止Rest控制器时,您只需要将所述控制器的属性更改为false。

SO 的链接,引用在运行时更改属性。

以下是我的工作代码片段:

@RefreshScope
@RestController
class MessageRestController(
    @Value("\${message.get.enabled}") val getEnabled: Boolean,
    @Value("\${message:Hello default}") val message: String
) {
    @GetMapping("/message")
    fun get(): String {
        if (!getEnabled) {
            throw NoHandlerFoundException("GET", "/message", null)
        }
        return message
    }
}

还有其他使用过滤器的替代方案:

@Component
class EndpointsAvailabilityFilter @Autowired constructor(
    private val env: Environment
): OncePerRequestFilter() {
    override fun doFilterInternal(
        request: HttpServletRequest,
        response: HttpServletResponse,
        filterChain: FilterChain
    ) {
        val requestURI = request.requestURI
        val requestMethod = request.method
        val property = "${requestURI.substring(1).replace("/", ".")}." +
                "${requestMethod.toLowerCase()}.enabled"
        val enabled = env.getProperty(property, "true")
        if (!enabled.toBoolean()) {
            throw NoHandlerFoundException(requestMethod, requestURI, ServletServerHttpRequest(request).headers)
        }
        filterChain.doFilter(request, response)
    }
}

我的 Github 解释如何在运行时禁用


推荐