17

我正在尝试设置一些代码,如果 spring 的请求范围可用,则以一种方式运行,如果所述范围不可用,则以另一种方式运行。

有问题的应用程序是一个 Web 应用程序,但有一些 JMX 触发器和计划任务(即 Quartz)也会触发调用。

例如

/**
 * This class is a spring-managed singleton
 */
@Named
class MySingletonBean{

    /**
     * This bean is always request scoped
     */
    @Inject
    private MyRequestScopedBean myRequestScopedBean; 

    /* can be invoked either as part of request handling
       or as part of a JMX trigger or scheduled task */
    public void someMethod(){
        if(/* check to see if request scope is available */){
            myRequestScopedBean.invoke();
        }else{
            //do something else
        }
    }
}

假设myRequestScopedBean是请求范围。

我知道这可以通过try-catch围绕调用来完成myRequestScopedBean,例如:

/**
 * This class is a spring-managed singleton
 */
@Named
class MySingletonBean{

    /**
     * This bean is always request scoped
     */
    @Inject
    private MyRequestScopedBean myRequestScopedBean; 

    /* can be invoked either as part of request handling
       or as part of a JMX trigger or scheduled task */
    public void someMethod(){
        try{
            myRequestScopedBean.invoke();
        }catch(Exception e){
            //do something else
        }
    }
}

但这似乎真的很笨重,所以我想知道是否有人知道一种优雅的 Spring 方式来询问某些东西以查看请求范围的 bean 是否可用。

非常感谢!

4

2 回答 2

18

您可以使用此处描述的 if 检查

SPRING - 获取当前范围

if (RequestContextHolder.getRequestAttributes() != null) 
    // request thread

而不是捕获异常。有时这看起来是最简单的解决方案。

于 2016-10-06T01:32:35.373 回答
2

您可以在调用方法时注入Provider<MyRequestScopedBean>并捕获异常,get但您应该重新考虑您的设计。如果您对此有强烈的感觉,您可能应该有两个具有不同限定符的 bean

编辑

再想一想,如果您使用的是 java 配置、@Scope("prototype")您的@Bean方法并在那里做出决定,您可以通过RequestContextHolder如果可用来获取请求上下文的句柄。但我强烈建议你重新考虑你的设计

于 2015-04-01T00:37:43.327 回答