【问题标题】:Jersy2 inject slf4j LoggerJersy2 注入 slf4j 记录器
【发布时间】:2016-09-07 09:42:49
【问题描述】:

我正在尝试了解 Jersey 2 开发和上下文依赖注入。

我不明白如何将需要在构造函数中初始化参数的对象注入资源。 例如:我想@Inject slf4j Logger,使用 LoggerFactory 构建。

我的资源类是:

@Path("/myresource")
public class MyResource {
    @Inject
    private Logger log;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Answer status() {
        log.info("STATUS");
        return new Answer(200, "Server up and running @ "+ ZonedDateTime.now());
    }
}

我的资源配置是:

public class MyAppextends ResourceConfig {
    public MyApp() {
        register(new MyBinder());
        packages(true, "my.packages");
    }
}

public class MyBinder extends AbstractBinder {

    @Override
    protected void configure() {
        bindFactory(MyLoggerFactory.class).to(org.slf4j.Logger.class);
    }
}

最后,工厂是:

public class MyLoggerFactory implements Factory<Logger> {

    @Override
    public Logger provide() {
        return LoggerFactory.getLogger(TYPE_FOR_LOGGING.class);
    }

    @Override
    public void dispose(Logger logger) {

    }
}

如何将 TYPE_FOR_LOGGING 指定为参数,以便在我想要的每个资源中注入正确初始化的 Logger?

谢谢

【问题讨论】:

    标签: dependency-injection jersey-2.0 hk2


    【解决方案1】:

    您要查找的内容称为InstantiationService。您可以将其注入到工厂中,以找出谁在提供方法中调用工厂。

    在下面找到一个来自 hk2 测试的代码示例,该示例说明了 InstantiationService 的使用。

    @Singleton
    public class CorrelationFactory implements Factory<PerLookupServiceWithName> {
        private final static PerLookupServiceWithName NULL_SERVICE = new PerLookupServiceWithName() {
    
            @Override
            public String getName() {
                return null;
            }
    
        };
    
        @Inject
        private InstantiationService instantiationService;
    
        /* (non-Javadoc)
         * @see org.glassfish.hk2.api.Factory#provide()
         */
        @Override @PerLookup
        public PerLookupServiceWithName provide() {
            InstantiationData data = instantiationService.getInstantiationData();
            if (data == null) {
                return NULL_SERVICE;
            }
    
            Injectee parent = data.getParentInjectee();
    
            if (parent == null) {
                return NULL_SERVICE;
            }
    
            Class<?> parentClass = parent.getInjecteeClass();
            if (parentClass == null) {
                return NULL_SERVICE;
            }
    
            Correlator correlator = parentClass.getAnnotation(Correlator.class);
            if (correlator == null) {
                return NULL_SERVICE;
            }
    
            final String fName = correlator.value();
    
            return new PerLookupServiceWithName() {
    
                @Override
                public String getName() {
                    return fName;
                }
    
            };
        }
    
        /* (non-Javadoc)
         * @see org.glassfish.hk2.api.Factory#dispose(java.lang.Object)
         */
        @Override
        public void dispose(PerLookupServiceWithName instance) {
            // DO nothing
        }
    
    }
    

    【讨论】:

    • 谢谢,这正是我需要的。能否请您指出 JavaDoc 以外的一些 HK2 文档?
    • 我能找到的关于 InstantiationService 的唯一其他文档是在 Factory javadoc 中。这可能应该修复,它可能需要比当前文档中更多的解释
    猜你喜欢
    • 2021-10-27
    • 2012-10-08
    • 2011-03-03
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多