首先,这不是自以为是的问题,我已经阅读了大部分相关问题。如果以下实施的解决方案是正确的方法/方法,我正在寻求建议。
我已经阅读了许多有关如何在jersey-based
网络应用中实施DI的教程,其中大多数建议必须在beans.xml
中创建WEB-INF/*
才能启用CDI但,我想知道使用泽西岛的AbstractBinder
是否能达到同样的效果?
我有一个jersey-webapp,在web.xml
<servlet>
<servlet-name>Test Jersey</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.test.config.AppConfig</param-value>
</init-param>
com.test.config.AppConfig
如下
public class AppConfig extends ResourceConfig {
public AppConfig() {
AbstractBinder binder = new AbstractBinder() {
@Override
protected void configure() {
bind(Impl.class).to(Interface.class).in(Singleton.class);
}
};
register(binder);
register(MultiPartFeature.class);
packages("..."); //packages
}
}
然后我注释接口并实现注入
@Inject
private SomeInterface someInterface;
以上工作正常。无论我想要注入什么,我都将它包含在binder
中,然后指定一个injection point
并注入它。
beans.xml
目录中没有WEB-INF/
,我想知道在AbstractBinder
内使用AppConfig
扩展ResourceConfig
是否无需声明beans.xml
}?
当我们使用beans.xml
或@Component
注释类时,添加@ManagedBean
可能会扫描可为DI铺平道路的类。
无论如何,我很乐意听取您对是否
的反馈/建议/建议/建议beans.xml
的注释发现,因为......?HK2
,是否值得使用不同的DI
容器还是HK2还不够好?有许多教程声明Tomcat不支持CDI?但是上面使用AbstractBinder
工作,我猜它是因为我以编程方式绑定?任何评论。
答案 0 :(得分:1)
我没有明确的答案,可能没有正确答案。尤其是因为Weld SE support was introduced in version 2.15 of Jersey而且这当然不是没有任何理由的。但我想尝试一下:
beans.xml
。注释和自动绑定可以通过一些额外的工作来完成(见下文)这个例子,我认为可能很有趣:
依赖关系(Maven):
<dependency>
<groupId>org.glassfish.hk2</groupId>
<artifactId>hk2-metadata-generator</artifactId>
<version>2.5.0-b05</version> <!-- HK2 version int. used by Jersey 2.23.2 -->
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
</dependency>
应用程序事件监听器:
import org.glassfish.hk2.api.*;
import org.glassfish.jersey.server.*;
@Provider
public class ApplicationListener implements ApplicationEventListener {
@Inject ServiceLocator serviceLocator;
@Override
public void onEvent(ApplicationEvent event) {
switch (event.getType()) {
case INITIALIZATION_FINISHED:
onInitFinished();
break;
case DESTROY_FINISHED:
case INITIALIZATION_APP_FINISHED:
case INITIALIZATION_START:
case RELOAD_FINISHED:
default:
break;
}
}
@Override
public RequestEventListener onRequest(RequestEvent requestEvent) { return null; }
public void onInitFinished() {
populate(serviceLocator);
}
private void populate(ServiceLocator serviceLocator) {
DynamicConfigurationService dcs = serviceLocator.getService(DynamicConfigurationService.class);
Populator populator = dcs.getPopulator();
try {
populator.populate();
} catch (IOException | MultiException e) {
throw new MultiException(e);
}
}
}
合同:
import org.jvnet.hk2.annotations.Contract;
@Contract
public interface ExampleService {
void executeSomething();
}
一项或多项服务:
import javax.inject.Named;
import org.jvnet.hk2.annotations.Service;
@Service
@Named("bar")
public class BarService implements ExampleService {
@Override
public void executeSomething() { /* doBar */ }
}
用法:
@Path("/")
public class TestResource {
// either ...
@Inject
@Named("bar")
private ExampleService bar;
// or ...
@Inject
private IterableProvider<ExampleService> services;
}
可以选择摆脱beans.xml
(我从未使用或已经看过)或ResourceConfig
内的声明,但它可能会找到感兴趣的各方:)
此外,似乎Jersey 3.0正在进行^^
祝你有愉快的一天!