如何在 Jersey 2 中使用 HK2 DI 框架?
How to use HK2 DI framkework with Jersey 2?
我正在尝试在 jersey 中使用 hk2 DI,我已经阅读了一些关于此事的文章。 (我认为大多数都过时了)
目前我有一个 class 扩展 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"); }
}
在另一个 class 中,我尝试注入其中一个绑定 classes:
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>
所以我看到了一些错误。
注入的类型需要是"contract"类型,如bind(Impl).to(Contract)
。 to(Contract)
指定要注入的 "advertised" 类型。
因此,与其尝试注入 PropertiesHandlerImpl
,不如注入合约 PropertiesHandler
@Inject
PropertiesHandler handler;
我不明白你是如何使用 JDBCConnectionStrategy
的。它没有在你的 AbstractBinder
中配置,所以我猜你只是自己实例化它。这行不通。您还需要将其连接到 DI 系统并注入它。
字段注入发生在构建之后。所以你不能在构造函数中使用服务,除非你将它注入到构造函数中。
@Inject
public JDBCConnectionStrategy(PropertiesHandler handler) {
}
我正在尝试在 jersey 中使用 hk2 DI,我已经阅读了一些关于此事的文章。 (我认为大多数都过时了)
目前我有一个 class 扩展 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"); }
}
在另一个 class 中,我尝试注入其中一个绑定 classes:
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>
所以我看到了一些错误。
注入的类型需要是"contract"类型,如
bind(Impl).to(Contract)
。to(Contract)
指定要注入的 "advertised" 类型。因此,与其尝试注入
PropertiesHandlerImpl
,不如注入合约PropertiesHandler
@Inject PropertiesHandler handler;
我不明白你是如何使用
JDBCConnectionStrategy
的。它没有在你的AbstractBinder
中配置,所以我猜你只是自己实例化它。这行不通。您还需要将其连接到 DI 系统并注入它。字段注入发生在构建之后。所以你不能在构造函数中使用服务,除非你将它注入到构造函数中。
@Inject public JDBCConnectionStrategy(PropertiesHandler handler) { }