[英]Jersey inject instance into Resource
我正在嘗試創建一個允許我重用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獲取不滿意的依賴項。
非常感謝幫助!
我發現澤西島的DI容器功能非常不愉快。 我更喜歡使用Guice來管理我的DI,所以如果你願意使用Guice,你可以看看如何連接Jersey和Guice在這個演示項目中進行協作: https : //bitbucket.org/marshallpierce/guice-jaxrs - 例子 。 common
子項目具有共享邏輯,並且還有其他子項目用於運動衫和重新安裝的特定部分。
好吧讓它工作:
當我第一次嘗試將應用程序部署到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
從那里開始幫助我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.