我正在尝试创建一个允许我重用ElasticSearch TransportClient的Jersey资源。所以我想在所有需要它的资源上使用TransportClient的单个实例。到目前为止,我已经得到了这个:
资源:
@Path("/request")
public class ConfigurationResource {
private final TransportClient transportClient;
@Inject
public ConfigurationResource(TransportClient transportClient)
{
this.transportClient = transportClient;
}
@GET
@Produces(MediaType.TEXT_PLAIN)
public String AlarmStatus(){
if(transportClient != null)
return "Not NULL! ID: ";
else
return "NULL :(";
}
}
结合:
public class WebMainBinder extends AbstractBinder {
@Override
protected void configure() {
TransportClient transportClient = null;
try {
transportClient = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
} catch (UnknownHostException e) {
e.printStackTrace();
return;
}
bind(transportClient).to(TransportClient.class);
}
}
主要应用:
@ApplicationPath("service")
public class WebMain extends ResourceConfig {
public WebMain(){
register(new WebMainBinder());
packages(true, "com.eniacdevelopment.EniacHome.Resources");
}
}
Web.xml中:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>com.eniacdevelopment.EniacHome.Application.WebMain</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>com.eniacdevelopment.EniacHome.Application.WebMain</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
</web-app>
我也试过使用这样的工厂:
public class TransportClientFactory implements Factory<TransportClient> {
private TransportClient transportClient;
@Override
public TransportClient provide() {
if(this.transportClient == null){
try {
transportClient = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));
} catch (UnknownHostException e) {
e.printStackTrace();
return null;
}
}
return transportClient;
}
@Override
public void dispose(TransportClient transportClient) {
}
}
然后以这种方式绑定它:
bindFactory(TransportClientFactory.class)
.to(TransportClient.class).in(Singleton.class);
但没有成功。我继续使用限定符@Default获取类型为TransportClient的不满意依赖项。
非常感谢帮助!
答案 0 :(得分:0)
我发现泽西岛的DI容器功能非常不愉快。我更喜欢使用Guice来管理我的DI,所以如果你打开使用Guice,你可以看看如何连接Jersey和Guice在这个演示项目中进行协作:https://bitbucket.org/marshallpierce/guice-jaxrs-examples。 common
子项目具有共享逻辑,并且还有其他子项目用于运动衫和重新安装的特定部分。
答案 1 :(得分:0)
好吧让它起作用了:
当我第一次尝试将应用程序部署到glassfish时,它抱怨了一些番石榴依赖性。我将玻璃鱼/模块中的番石榴罐与已安装的一个maven交换并将其部署。它可能与此有关。这里没有guarentees。
我决定放弃整个玻璃鱼的东西,从头开始。在球衣介绍页面上有这样的maven原型,可以这样安排:
mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false -DgroupId=com.example -DartifactId=simple-service
-Dpackage=com.example
-DarchetypeVersion=2.24
从那里开始帮助我。