Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时停止Spring@Controller_Spring_Spring Mvc_Spring Boot - Fatal编程技术网

在运行时停止Spring@Controller

在运行时停止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}"

我已经找到了哪些地址在引导时不启动@Controller,但我正在寻找一种在运行时停止@Controller的方法。

我实际上会使用@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)
    }
}

我实际上使用了@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,这回答了您的问题吗?