动态每个REST(Jersey)请求绑定Guice中的配置

时间:2016-03-18 16:57:29

标签: java binding dependency-injection jersey guice

我们在DI项目中使用Guice。目前我们有一些配置(属性),我们从文件加载t服务器启动。然后将它们绑定到所有组件和组件上。用于所有请求。

但是现在,我们有多个属性文件&在启动时加载它们。每个REST(Jersey)请求的这些配置可能不同,因为它们取决于输入。

因此,我们需要为每个请求动态绑定这些配置。我查看了@RequestScoped的Guice API,但没有找到任何特别有帮助的内容。

与此类似的问题很少,但还没有运气。能帮帮我吧。

1 个答案:

答案 0 :(得分:0)

我提供了2种方法,这两种方式都是请求范围。

  1. 使用HttpServletRequest,用于可以注入请求对象的类。
  2. 使用ThreadLocal,通用方式。它可以在任何类中使用。
    注意:如果在代码中创建新线程并想要访问该值,则此方法不起作用。在这种情况下,您必须将值通过Objects传递给这些线程)
  3. 我的意思是这样的:

    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();
        }
    
    }