如何使用泽西2的HK2 DI框架?

时间:2017-01-10 17:06:18

标签: java dependency-injection jax-rs jersey-2.0 hk2

我正在尝试在球衣中使用hk2 DI,我已经阅读了一些关于此事的文本。 (大多数都是我想的过时了) 目前我有一个扩展ResourceConfig的类:

public class MyApplication extends ResourceConfig{
    public MyApplication(){
        register(new AbstractBinder() {
            @Override
            protected void configure() {
                bind(AuthenticationServiceImpl.class).to(AuthenticationService.class);
                bind(PropertiesHandlerImpl.class).to(PropertiesHandler.class).in(Singleton.class);
            }
        });
        packages(true, "com.myclass");        }
}

在另一个类中我尝试注入其中一个绑定类:

public class JDBCConnectionStrategy implements DatabaseConnectionStrategy {
    private Connection connection;

    @Inject
    PropertiesHandlerImpl propertiesHandler;

    public JDBCConnectionStrategy() throws SQLException{
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            String host = propertiesHandler.getProperty("host");
            String userName = propertiesHandler.getProperty("userName");
            String password = propertiesHandler.getProperty("password");
            //Create a connection
            this.connection = DriverManager.getConnection(host, userName, password);
        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
....
}

声明:

@Singleton
@Service
public class PropertiesHandlerImpl implements PropertiesHandler {...}

问题:启动应用时出现以下错误

WARNING: The following warnings have been detected: WARNING: Unknown HK2 failure detected:
MultiException stack 1 of 2 java.lang.NullPointerException
    at com.myclass.JDBCConnectionStrategy.<init>

更新
我应该补充一点,我将应用程序包添加到web.xml中的扫描路径:

    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.myclass.system.CmisApplication</param-value>
    </init-param>

1 个答案:

答案 0 :(得分:1)

所以我看到一些错误。

  1. 注入的类型需要是&#34;合同&#34;类型,如bind(Impl).to(Contract)中所示。 to(Contract)指定了宣传的内容&#34;要注入的类型。

    因此,您不会尝试注入PropertiesHandlerImpl,而是注入合同PropertiesHandler

    @Inject
    PropertiesHandler handler;
    
  2. 我不知道你是如何使用JDBCConnectionStrategy的。它未在AbstractBinder中配置,因此我猜测您只是自己实例化它。这不会奏效。你还需要将它连接到DI系统并注入它。

  3. 在构建之后发生字段注入。因此,除非将其注入构造函数,否则无法在构造函数中使用该服务。

    @Inject
    public JDBCConnectionStrategy(PropertiesHandler handler) {
    
    }