Java Jersey 2.0的依赖注入

从头开始,在没有任何Jersey 1.x知识的情况下,我很难理解如何在Jersey 2.0项目中设置依赖项注入。

我也知道HK2在Jersey 2.0中可用,但是我似乎找不到帮助Jersey 2.0集成的文档。

@ManagedBean

@Path("myresource")

public class MyResource {

@Inject

MyService myService;

/**

* Method handling HTTP GET requests. The returned object will be sent

* to the client as "text/plain" media type.

*

* @return String that will be returned as a text/plain response.

*/

@GET

@Produces(MediaType.APPLICATION_JSON)

@Path("/getit")

public String getIt() {

return "Got it {" + myService + "}";

}

}

@Resource

@ManagedBean

public class MyService {

void serviceCall() {

System.out.print("Service calls");

}

}

pom.xml

<properties>

<jersey.version>2.0-rc1</jersey.version>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

</properties>

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.glassfish.jersey</groupId>

<artifactId>jersey-bom</artifactId>

<version>${jersey.version}</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

<dependencies>

<dependency>

<groupId>org.glassfish.jersey.core</groupId>

<artifactId>jersey-common</artifactId>

</dependency>

<dependency>

<groupId>org.glassfish.jersey.core</groupId>

<artifactId>jersey-server</artifactId>

</dependency>

<dependency>

<groupId>org.glassfish.jersey</groupId>

<artifactId>jax-rs-ri</artifactId>

</dependency>

</dependencies>

我可以让容器启动并使用我的资源,但是一旦我将@Inject添加到MyService,框架就会引发异常:

SEVERE: Servlet.service() for servlet [com.noip.MyApplication] in context with path [/jaxrs] threw exception [A MultiException has 3 exceptions.  They are:

1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=MyService,parent=MyResource,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,1039471128)

2. java.lang.IllegalArgumentException: While attempting to resolve the dependencies of com.noip.MyResource errors were found

3. java.lang.IllegalStateException: Unable to perform operation: resolve on com.noip.MyResource

] with root cause

org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=MyService,parent=MyResource,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,1039471128)

at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:74)

回答:

你需要定义一个AbstractBinder并将其注册到你的JAX-RS应用程序中。活页夹指定依赖项注入应如何创建类。

public class MyApplicationBinder extends AbstractBinder {

@Override

protected void configure() {

bind(MyService.class).to(MyService.class);

}

}

@Inject在类型的参数或字段上检测到时,将MyService.class使用类将其实例化MyService。要使用此资料夹,需要在JAX-RS应用程序中注册它。在你的中web.xml,定义一个JAX-RS应用程序,如下所示:

<servlet>

<servlet-name>MyApplication</servlet-name>

<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

<init-param>

<param-name>javax.ws.rs.Application</param-name>

<param-value>com.mypackage.MyApplication</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>MyApplication</servlet-name>

<url-pattern>/*</url-pattern>

</servlet-mapping>

实现MyApplication类(在上面指定init-param)。

public class MyApplication extends ResourceConfig {

public MyApplication() {

register(new MyApplicationBinder());

packages(true, "com.mypackage.rest");

}

}

指定依赖项注入的活页夹已在类的构造函数中注册,并且我们还MyResource通过packages()方法调用告诉应用程序在哪里找到REST资源(在你的情况下为)。

以上是 Java Jersey 2.0的依赖注入 的全部内容, 来源链接: utcz.com/qa/422499.html

回到顶部