簡體   English   中英

Jersey將實例注入資源

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM