如果我使用Jersey 1.12,并且我有多个资源类,并且它们都需要访问一些共享上下文,那么注入依赖项的最佳方法是什么,无论是在资源类的构造函数中还是在处理程序方法中?我是否需要使用外部DI库,或者Jersey内置了什么?

也许Foos的资源看起来像这样:

package com.example.resource;

import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;

@Path("/some/api/path/foo")
public class FooResource
{
    @GET
    @Produces("text/html")
    public String getFoo(@QueryParam("id") String id)
    {
        Foo foo = /* get a Foo from some shared context based on id */
        /* Process foo into a String */
    }
}

和酒吧:

package com.example.resource;

import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;

@Path("/some/api/path/bar")
public class BarResource
{
    @GET
    @Produces("text/html")
    public String getBar(@QueryParam("id") String id)
    {
        Bar bar = /* get a Bar from some shared context based on id */
        /* Process bar into a String */
    }
}

解决方法

我最终使用了Google Guice,这是一个轻量级的DI框架,可以很好地与Jersey集成.这就是我必须做的事情:

首先,我在pom.xml中添加了依赖项:

<dependency>
        <groupId>com.google.inject</groupId>
        <artifactId>guice</artifactId>
        <version>3.0</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey.contribs</groupId>
        <artifactId>jersey-guice</artifactId>
        <version>1.12</version>
        <scope>compile</scope>
    </dependency>

我希望将DAO实现为具有接口的单例:

public interface MySingletonDao
{
    // ... methods go here ...
}

和具体的实施:

@Singleton
public class ConcreteMySingletonDao implements MySingletonDao
{
    // ... methods go here ...
}

像这样装饰资源类:

@Path("/some/path")
@RequestScoped
public class MyResource
{
    private final MySingletonDao mySingletonDao;

    @Inject
    public MyResource(MySingletonDao mySingletonDao)
    {
        this.mySingletonDao = mySingletonDao;
    }

    @POST
    @Produces("application/json")
    public String post() throws Exception
    {
            // ... implementation goes here ...
    }
}

创建了一个将执行绑定的类:

public class GuiceConfig extends Guiceservletcontextlistener
{
    @Override
    protected Injector getInjector()
    {
        return Guice.createInjector(new JerseyServletModule()
        {
            @Override
            protected void configureServlets()
            {
                bind(MyResource.class);
                bind(AnotherResource.class);
                bind(MySingletonDao.class).to(ConcreteMySingletonDao.class);
                serve("/*").with(GuiceContainer.class);
            }
        });
    }
}

我使用Jetty而不是Glassfish来实际充当服务器.在我的功能测试中,它看起来像:

private void startServer() throws Exception
{
    this.server = new Server(8080);
    ServletContextHandler root =
        new ServletContextHandler(server,"/",ServletContextHandler.SESSIONS);

    root.addEventListener(new GuiceConfig());
    root.addFilter(GuiceFilter.class,"/*",EnumSet.of(dispatcherType.REQUEST));
    root.addServlet(EmptyServlet.class,"/*");

    this.server.start();
}

EmptyServlet来自Sunny Gleason的示例代码,作为答案给出:https://stackoverflow.com/a/3296467 – 我原来的

root.addServlet(new ServletHolder(new ServletContainer(new PackagesResourceConfig("com.example.resource"))),"/*");

而不是线

root.addServlet(EmptyServlet.class,"/*");

但是这导致Jersey尝试执行依赖注入而不是Guice,这会导致运行时错误.

java – 使用Jersey的依赖注入的更多相关文章

  1. xmlhttprequest – AngularJS和位于不同域中的Jersey Webservice之间的通信.无法访问正确的会话

    亲爱的stackoverflow读者,最近我一直在玩AngularJS和JavaEE6.我已经和泽西建立了一个webservice,并在Glassfish上部署了这个项目.因为我需要某种身份验证和OAuth实现,或者JDBCRealm似乎过度杀戮,所以我决定在用户成功登录后创建一个会话.这似乎工作正常,如果我发布到/从Postman或从部署在glassfish上的基本jQuery网页登录,我将获得

  2. java – 使用RolesAllowedDynamicFeature和Jersey授权

    我正在尝试使用JAX-RS过滤器对用户进行身份验证.这是我正在设置新SecurityContext的过滤器:资源方法如下所示:RolesAllowedDynamicFeature的注册方式如下:我可以在控制台上看到预期的输出.但是,如果我取消注释@RolesAllowed(“user”),我会收到Forbidden错误,并且永远不会调用SecurityContext的isUserInRole方法.

  3. Angular SPA + Jersey + SpringMVC 整合应用

    原文排版地址:AngularSPA+Jersey+SpringMVC整合应用AngularSPA单页面应用和MVC控制器的整合,会有一个疑问,SPA中点击链接的跳转,是经过SPA的路由,还是直接被SpringMVC拦截了?

  4. java – Jersey客户端响应状态204

    我正在使用Jersey服务和客户端.当我试图调用该服务时,我收到此错误:我不懂为什么.这是服务:这是客户:我真的不知道问题可能是什么.我知道另一个问题,看似相同的主题,但他们不是.如果我遗漏了某些内容或者您需要任何额外信息,请告诉我.解决方法204是HTTP响应状态代码,通知客户端没有返回内容.当你的客户端调用get(JSONArray.class)时,它期望有200个数据,因此是例外.从服务器实

  5. java – 如何单元测试传入的Jersey MultiPart请求的处理

    编辑运用会抛出一个我认为,在调用我的MultiPartReader之前,还需要以某种方式转换测试生成的MultiPart.在jersey中必须有一些方法,我可以调用它来执行此转换它的方式,当它在已部署的系统上发出MultiPart请求时,或者可能是接收端在接收HTTP请求时进行一些解析..?

  6. java – jersey 2.2:ContainerResponseFilter和ContainerRequestFilter永远不会被执行

    解决方法事实证明,您必须手动注册自定义类–如:完整示例:

  7. java – 要为jersey.repackaged.com.google.common.collect.Maps避免NoClassDefFoundError而添加的Jersey依赖项

    我正在尝试运行一个扩展JerseyTest的测试但是在运行时我得到了一个:知道我缺少什么依赖吗?

  8. java – Http 415 on file上传使用jersey

    我的RESTful文件上传代码:当我尝试使用curl上传文件时curl-XPOST–表示part=@file.txt网址我收到HTTP415不支持的媒体类型错误.怎么了?

  9. java – 使用Jersey的依赖注入

    如果我使用Jersey1.12,并且我有多个资源类,并且它们都需要访问一些共享上下文,那么注入依赖项的最佳方法是什么,无论是在资源类的构造函数中还是在处理程序方法中?我是否需要使用外部DI库,或者Jersey内置了什么?

  10. java – Jersey序列化/反序列化问题:抽象类型只能使用其他类型信息进行实例化

    我正在使用球衣进行序列化和反序列化.我使用jersey在WebLogic上创建了REST通道.我有结果对象包含抽象类.Jersey使用此类的实现名称添加结果元数据:但是,同样的球衣,当用于反序列化这些数据时,会尖叫以下内容:但是他自己已经在他序列化的JSON中提供了这些额外的信息.那么,如何让球衣阅读并理解他创造的这种“@type”注释?

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部