【问题标题】:Jersey injection泽西注射
【发布时间】:2016-04-30 22:01:47
【问题描述】:

有没有办法改变注入到所有资源和类中的 UriInfo 的实现?我想保持大部分实现相同,但只更改其中的一部分(提供 UriBuilder 的部分 - 我想提供 UriBuilder 的不同实现)。

【问题讨论】:

    标签: dependency-injection jersey jersey-2.0 uribuilder


    【解决方案1】:

    您可以围绕原始 UriInfo 创建包装器

    public class MyUriInfo implements UriInfo {
    
        private final UriInfo delegate;
    
        public MyUriInfo(UriInfo uriInfo) {
            this.delegate = uriInfo;
        }
    
        @Override 
        public String getPath() { 
            return delegate.getPath(); 
        }
    
        @Override
        public UriBuilder getRequestUriBuilder() {
            return new MyUriBuilder();
        }
        ...
    }
    

    然后只需创建一个Factory 即可返回您的自定义UriInfo。这个Factory 将被DI 框架用来注入UriInfo

    public class MyUriInfoFactory 
            extends AbstractContainerRequestValueFactory<MyUriInfo> {
    
        @Override
        public MyUriInfo provide() {
            return new MyUriInfo(getContainerRequest().getUriInfo());
        }
    }
    

    然后只需创建AbstractBinder 并将其注册到ResourceConfig

    public class Binder extends AbstractBinder {
    
        @Override
        protected void configure() {
            bindFactory(MyUriInfoFactory.class)
                    .to(UriInfo.class)
                    .in(RequestScoped.class)
                    .proxy(true)
                    .proxyForSameScope(false)
                    .ranked(10);
        }
    }
    
    public class AppConfig extends ResourceConfig {
        public AppConfig() {
            register(new Binder());
        }
    }
    

    如果您使用的是 web.xml,请查看this post

    现在你应该可以注入它了

    @GET
    public String get(@Context UriInfo uriInfo) {
        return uriInfo.getClass().getName();
    }
    

    如果您希望能够保留能够注入原始UriInfo,您可以将绑定更改为

    bindFactory(MyUriInfoFactory.class)
            .to(MyUriInfo.class)  // <--- Change here to MyUriInfo
            .in(RequestScoped.class)
            .proxy(true)
            .proxyForSameScope(false)
            .ranked(10);
    

    这样,你需要注入MyUriInfo

    @GET
    public String get(@Context MyUriInfo uriInfo) {
        return uriInfo.getClass().getName();
    }
    

    这样做,如果需要,您仍然可以注入原始的UriInfo

    另请参阅:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      相关资源
      最近更新 更多