我们在DI项目中使用Guice。目前我们有一些配置(属性),我们从文件加载t服务器启动。然后将它们绑定到所有组件和组件上。用于所有请求。
但是现在,我们有多个属性文件&在启动时加载它们。每个REST(Jersey)请求的这些配置可能不同,因为它们取决于输入。
因此,我们需要为每个请求动态绑定这些配置。我查看了@RequestScoped
的Guice API,但没有找到任何特别有帮助的内容。
与此类似的问题很少,但还没有运气。能帮帮我吧。
答案 0 :(得分:0)
我提供了2种方法,这两种方式都是请求范围。
HttpServletRequest
,用于可以注入请求对象的类。ThreadLocal
,通用方式。它可以在任何类中使用。 我的意思是这样的:
public class RequestFilter implements ContainerRequestFilter {
@Context
private HttpServletRequest request;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
List listOfConfig = //load Config;
request.setAttribute("LOADED_CONFIG",listOfConfig);
// If you want to access this value at some place where Request object cannot be injected (like in service layers, etc.) Then use below ThreadLocals.
ThreadLocalWrapper.getInstance().get().add("adbc"); // In general add your config here, instead of abdc.
}
}
My ThreadLocalWrapper如下所示:
public class ThreadLocalWrapper {
private static ThreadLocal<List<String>> listOfStringLocals; // You can modify this to a list of Object or an Object by itself.
public static synchronized ThreadLocal<List<String>> getInstance() {
if (listOfStringLocals == null) {
listOfStringLocals = new ThreadLocal<List<String>>() {
@Override
protected List<String> initialValue() {
return new ArrayList<String>();
}
};
}
return listOfStringLocals;
}
}
要访问该值:
在Controller中 - 注入HttpServletRequest
对象并执行getAttribute()以获取值。由于HttpServletRequest
对象是requestScoped,因此您可以设置加载的配置。进入此并再次使用请求对象在控制器中访问它。
在代码的任何其他部分 - 如果HttpServletRequest
不可用,那么您始终可以使用显示的ThreadLocal示例。要访问此值。
public class GuiceTransactionImpl implements GuiceTransaction {
private String value = "";
public GuiceTransactionImpl(String text) {
value = text;
}
@Override
public String returnSuccess() {
return value + " Thread Local Value " + ThreadLocalWrapper.getInstance().get();
}
}