在运行时停止Spring@Controller
我已经找到了哪些地址在引导时不启动@Controller,但我正在寻找一种在运行时停止@Controller的方法。我实际上会使用@RefreshScope Bean,然后当您想在运行时停止Rest控制器时,您只需要将所述控制器的属性更改为false 因此,我们在运行时引用更改属性 以下是我的工作代码片段:在运行时停止Spring@Controller,spring,spring-mvc,spring-boot,Spring,Spring Mvc,Spring Boot,我已经找到了哪些地址在引导时不启动@Controller,但我正在寻找一种在运行时停止@Controller的方法。我实际上会使用@RefreshScope Bean,然后当您想在运行时停止Rest控制器时,您只需要将所述控制器的属性更改为false 因此,我们在运行时引用更改属性 以下是我的工作代码片段: @RefreshScope @RestController class MessageRestController( @Value("\${message.get.enabled}"
@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)
}
}
我实际上使用了@RefreshScope Bean,当您想在运行时停止Rest控制器时,只需将所述控制器的属性更改为false即可 因此,我们在运行时引用更改属性 以下是我的工作代码片段:
@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)
}
}
Hm,由于每个@Controller都是一个普通的bean,我可能可以像其他bean一样销毁它,方法是从上下文中检索它作为
DefaultListableBeanFactory
,然后用bean的名称调用destroySingleton()
。为什么需要销毁它?您还可以返回一个带有if(某些circunstatus)的404。嗯,因为每个@Controller都是一个普通的bean,所以我可能可以像其他bean一样销毁它,方法是从上下文中检索它作为DefaultListableBeanFactory
,并使用该bean的名称调用destroySingleton()
。为什么需要销毁它?您还可以返回一个带有if(特定循环)的404。@Andras Hatvani,这回答了您的问题吗?@Andras Hatvani,这回答了您的问题吗?