Jersey将实例注入资源

时间:2016-11-11 09:56:31

标签: java jersey

我正在尝试创建一个允许我重用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的不满意依赖项。

非常感谢帮助!

2 个答案:

答案 0 :(得分:0)

我发现泽西岛的DI容器功能非常不愉快。我更喜欢使用Guice来管理我的DI,所以如果你打开使用Guice,你可以看看如何连接Jersey和Guice在这个演示项目中进行协作:https://bitbucket.org/marshallpierce/guice-jaxrs-examplescommon子项目具有共享逻辑,并且还有其他子项目用于运动衫和重新安装的特定部分。

答案 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

从那里开始帮助我。