gpt4 book ai didi

spring - 获取请求属性并将其存储以供以后在应用程序中的任何位置使用

转载 作者:行者123 更新时间:2023-12-02 06:53:53 24 4
gpt4 key购买 nike

我正在使用 Spring MVC,我想从请求 header 中获取一些参数,并将它们存储在当前请求期间应用程序中任何位置都可用的对象中。想象一个应用程序范围的元数据类。

我想避免使用RequestContextHolder,因为 Controller 下面的应用程序的其他部分不应该关心这些值来自请求。它应该是可用的。

我还考虑过使用请求范围的 bean,但随后我必须将它连接到我想要使用它的任何地方。 I 反对“只是让它可用”

任何有关从哪里开始的信息都会很棒。

更新:

这是我的想法。我担心当其他请求到来时,他们会设置上一个请求的transactionId。

连接请求作用域 bean:

     <bean id="metaDataContextHolder" class="com.yp.common.context.MetadataContextHolder" scope="request">
<aop:scoped-proxy/>
</bean>

这是请求作用域的 bean

public class MetadataContextHolder {

private static String transactionId;
//removed other properties for brevity

public static String getTransactionId() {
return transactionId;
}

public void setTransactionId(String transactionId) {
this.transactionId = transactionId;
}
}

捕获要存储的过滤器中的请求 header 以供整个应用程序使用:

public class RequestMetatDataFilter implements Filter
{

@Autowired
MetadataContextHolder metaDataHolder;

@Override
public void init(FilterConfig arg0) throws ServletException
{

}

/**
* This filter will add common request metatdata to the MetaDataContextHolder
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse response, FilterChain filerChain) throws IOException, ServletException
{
HttpServletRequest request = ((HttpServletRequest)servletRequest);
String transactionId = request.getHeader("transactionId");
metaDataHolder.setTransactionId(transactionId);
...
//store other values
...

filerChain.doFilter(request, response);

}

@Override
public void destroy() {
// TODO Auto-generated method stub

}
}

然后可以在任何地方访问元数据,而无需再次连接元数据 bean,如下所示:

MetaDataContextHolder.getTransactionId();

更新2

正如我所怀疑的,MetadataContextHolder 中的静态属性“transactionId”会根据每个请求进行更新。

有可能实现我想要做的事情吗?

最佳答案

这个答案分为两部分:

I would like to avoid using the RequestContextHolder because other parts of the application below the controller shouldn't care that the values came from the request. It should just be available.

是的,这部分是有道理的,正如你刚才所说的。

I also thought of using a request scoped bean, but then I would have to wire it up everywhere I wanted to use it. I which goes against "just having it available"

使用请求范围的 bean Autowiring 是这里的方法。当您说您只是想让它可用时,并不完全清楚这意味着什么。听起来您想要一个单例,但它只包含当前请求的数据,无论谁在访问它。请求作用域 bean 旨在仅保存当前请求数据(如您所知),而单例则不然。我实际上会考虑通过注释 Autowiring bean“只是让它可用”。此外,将其作为 bean 而不是单例使得在需要时更容易测试/模拟。

关于spring - 获取请求属性并将其存储以供以后在应用程序中的任何位置使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35096132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com