如何检查 Spring 中请求范围的可用性?
How to check for Request Scope availability in Spring?
我正在尝试设置一些代码,如果 spring 的请求范围可用,则以一种方式运行,如果所述范围不可用,则以另一种方式运行。
有问题的应用程序是一个网络应用程序,但有一些 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
是请求范围的。
我知道这可以通过围绕 myRequestScopedBean
调用的 try
-catch
来完成,例如:
/**
* 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 是否可用。
非常感谢!
您可以注入 Provider<MyRequestScopedBean>
并在调用 get
方法时捕获异常,但您应该重新考虑您的设计。如果您对此有强烈的感觉,您可能应该有两个具有不同限定符的 bean
编辑
再想一想,如果您正在使用 java 配置,@Scope("prototype")
您的 @Bean
方法并在那里做出决定,您可以通过 [=14 获取请求上下文的句柄=] 如果可用。但我强烈建议您重新考虑您的设计
您可以使用此处描述的 if 检查
SPRING - Get current scope
if (RequestContextHolder.getRequestAttributes() != null)
// request thread
而不是捕获异常。
有时这看起来是最简单的解决方案。
我正在尝试设置一些代码,如果 spring 的请求范围可用,则以一种方式运行,如果所述范围不可用,则以另一种方式运行。
有问题的应用程序是一个网络应用程序,但有一些 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
是请求范围的。
我知道这可以通过围绕 myRequestScopedBean
调用的 try
-catch
来完成,例如:
/**
* 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 是否可用。
非常感谢!
您可以注入 Provider<MyRequestScopedBean>
并在调用 get
方法时捕获异常,但您应该重新考虑您的设计。如果您对此有强烈的感觉,您可能应该有两个具有不同限定符的 bean
编辑
再想一想,如果您正在使用 java 配置,@Scope("prototype")
您的 @Bean
方法并在那里做出决定,您可以通过 [=14 获取请求上下文的句柄=] 如果可用。但我强烈建议您重新考虑您的设计
您可以使用此处描述的 if 检查
SPRING - Get current scope
if (RequestContextHolder.getRequestAttributes() != null)
// request thread
而不是捕获异常。 有时这看起来是最简单的解决方案。