使用Jersey进行基本的依赖注入从业务层开始

7

我正在开发一个与RESTful服务相关的项目。我有web层、业务层等模块。我添加了基本的api层(使用Jersey),并且我可以获取GET请求的基本响应。现在我必须将其连接到业务层。我搜索了一下,但不确定如何将每个解决方案实施到我的项目中。

这是我针对旅行的资源类:

@Path("trip")
public class TripResource {

    @Context
    private UriInfo context;
    @Inject
    private AdminService adminService;

    public TripResource() {
    }

    @GET
    @Produces("text/plain")
    public List<TripDTO> getText() {
        return adminService.listAllTrips();
    }

}

我用这个来添加资源类:

@javax.ws.rs.ApplicationPath("api")
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet<Class<?>>();
        addRestResourceClasses(resources);
        return resources;
    }
    private void addRestResourceClasses(Set<Class<?>> resources) {
        resources.add(cz.infi.javatravelagency.ServiceResource.class);
        resources.add(cz.infi.javatravelagency.TripResource.class);
    }
}

My pom.xml:

<name>JavaTravelAgency - Api module</name>
    <dependencies>
         <dependency>
            <groupId>cz.infi</groupId>
            <artifactId>javatravelagency-business</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
            <version>2.4.1</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <type>jar</type>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <!-- Java language version -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>6</source>
                    <target>6</target>
                </configuration>
            </plugin>
            <!-- Servlet 3.0 without web.xml -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1.1</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>

我尝试按照这个链接中的答案进行操作。我只是添加了以下内容:

public class MyApplicationBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bind(AdminServiceImpl.class).to(AdminService.class);
    }
}

现在我遇到了困难。

我该如何将这个绑定器添加到我的配置类中?最简单的实现方法是什么,而不使用任何其他技术?

2个回答

10

这也花费了我很多时间。

请尝试以下操作:

  1. 根据此处描述,在您的项目中添加一个HK2绑定器:https://jersey.java.net/documentation/latest/migration.html

在这里,您需要将绑定器添加到业务逻辑中。 您已经有了这个(只是为了完整性而添加)。

例如:

public class MyBinder extends AbstractBinder {

    @Override
    protected void configure() {
        // request scope binding
        bind(MyInjectablePerRequest.class)
                .to(MyInjectablePerRequest.class)
                .in(RequestScope.class);
        // singleton binding
        bind(MyInjectableSingleton.class).in(Singleton.class);
        // singleton instance binding
        bind(new MyInjectableSingleton()).to(MyInjectableSingleton.class);
    }
}

接下来在项目中添加一个“ResourceConfig”类,并像此处注册您的绑定器:http://sleeplessinslc.blogspot.de/2012/10/jax-rs-20-jersey-20-preview-example.html

在您的情况下,您可以简单地将ApplicationConfig从ResourceConfig扩展而不是ApplicationConfig(这就是我所做的)。然后,“getClasses()”中注册的所有类应该如下所述。

例如:

/**
 * Application config
 */
public class ApplicationConfig extends ResourceConfig {

    public ApplicationConfig() {
        register(SomeResources.class, SomeProviders.class);

        // Register different Binders
        addBinders(new MyBinder());
    }
}

请确保您的web.xml使用了配置。这取决于您的设置(glassfish,servlet v1/v2等)。

如果您已经在使用ApplicationConfig类,那么很有可能您已经使用了正确的设置。

以下是一个示例:

<servlet>
    <servlet-name>om.example.package.to.your.config.ApplicationConfig</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.example.package.to.your.config.ApplicationConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

希望这可以帮到你 ;)

敬礼 Ben


刚才发现了一个类似的帖子: Jersey 2.0中的依赖注入


-6

您需要在Jersey中注册您的资源类。因此,如果您的应用程序名为MyApplication,则可以执行以下操作:

public class MyApplication extends ResourceConfig {

    /*Register JAX-RS application components.*/
    public MyApplication () {
        register(TripResource.class);
    }
}

此外,在web.xml文件中,将MyApplication添加到servlet容器中:

<servlet>
    <servlet-name>SpringApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>mypackage.MyApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

使用Spring DI和Jersey的简单示例可以在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接