Resteasy 和 Google Guice:如何通过 @Injection 使用多个 @ApplicationPath 和资源?

2023-11-26

I 创建了一个项目使用 Resteasy 在我的 Jax-rs 资源中测试 Google Guice 提供的依赖项注入。

我的意图是:

  • 使用多个@ApplicationPath对于我的 API 的版本。在每个类中注释为@ApplicationPath我为特定版本加载一组类。
  • 每个资源都有一个@Inject(来自 Google Guice)在他的构造函数中注入一些服务。

我创建了两个带有注释的类@ApplicationPath: ApplicationV1RS and ApplicationV2RS。在这两个中我都添加了相同的资源类(UserResource and HelloResource),仅用于我的测试。

我的模块配置如下:

public class HelloModule implements Module
{
   public void configure(final Binder binder)
   {
      binder.bind(IGreeterService.class).to(GreeterService.class);

      binder.bind(IUserService.class).to(UserService.class);
   }
}

当我打电话时http://localhost:9095/v1/hello/world or http://localhost:9095/v2/hello/world,我收到同样的错误:

java.lang.RuntimeException: RESTEASY003190: Could not find constructor 
    for class: org.jboss.resteasy.examples.guice.hello.HelloResource

嗯,正如我所料,这不起作用。 Google Guice 并不“聪明”地使用构造函数实例化资源类。

但我找不到工作的方法。说实话,我真的很困惑 Google Guice、Jetty 和 Resteasy 在这种情况下如何相互配合。

如果我放弃使用的想法@ApplicationPath,我的资源与 Google Guice 一起配置我的HelloModule像这样:

public class HelloModule implements Module
{
   public void configure(final Binder binder)
   {
      binder.bind(HelloResource.class);
      binder.bind(IGreeterService.class).to(GreeterService.class);

      binder.bind(UserResource.class);
      binder.bind(IUserService.class).to(UserService.class);
   }
}

但在这种情况下,我将传递控制权来注册我的资源(HelloResource and UserResource)到吉斯。这对我来说不灵活,我无法设置我的多个@ApplicationPath.

那么,我缺少或不理解什么?

我使用有问题的代码创建了一个项目。设置和测试非常容易:https://github.com/dherik/resteasy-guice-hello/tree/so-question/README.md

Thanks!


当你有getClasses方法,然后它尝试使用我们的 Resources 类中缺少的默认构造函数为所有注册资源创建实例。一种方法是创建默认构造函数并通过 setter 注入注入依赖项。 然后而不是覆盖getClasses in ApplicationV1RS and ApplicationV2RS你覆盖getSingletons。由于资源可以是单例的。

以下是我为使其按照您想要的方式工作而所做的更改。

应用程序V1RS.java

@ApplicationPath("v1")
public class ApplicationV1RS extends Application {

    private Set<Object> singletons = new HashSet<Object>();

    public ApplicationV1RS(@Context ServletContext servletContext) {
    }

    @Override
    public Set<Object> getSingletons() {
        Injector injector = Guice.createInjector(new HelloModule());

        HelloResource helloResource = injector.getInstance(HelloResource.class);
        UserResource userResource = injector.getInstance(UserResource.class);
        singletons.add(helloResource);
        singletons.add(userResource);
        return singletons;
    }
}

应用程序V2RS.java

@ApplicationPath("v2")
public class ApplicationV2RS extends Application {

    private Set<Object> singletons = new HashSet<Object>();

    public ApplicationV2RS(@Context ServletContext servletContext) {
    }

    @Override
    public Set<Object> getSingletons() {
        Injector injector = Guice.createInjector(new HelloModule());

        HelloResource helloResource = injector.getInstance(HelloResource.class);
        UserResource userResource = injector.getInstance(UserResource.class);
        singletons.add(helloResource);
        singletons.add(userResource);
        return singletons;
    }
}

HelloResource.java

@Path("hello")
public class HelloResource {
    @Inject
    private IGreeterService greeter;

    public HelloResource() {
    }

    @GET
    @Path("{name}")
    public String hello(@PathParam("name") final String name) {
        return greeter.greet(name);
    }
}

用户资源.java

@Path("user")
public class UserResource {

    @Inject
    private IUserService userService;

    public UserResource() {
    }

    @GET
    @Path("{name}")
    public String hello(@PathParam("name") final String name) {
        return userService.getUser(name);
    }
}

Add @Singleton到您的服务等级。

希望能帮助到你。

我也将代码推送到分叉回购协议。一探究竟

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Resteasy 和 Google Guice:如何通过 @Injection 使用多个 @ApplicationPath 和资源? 的相关文章

  • Tomcat 是否立即支持 JAX-RS(它是否支持 JAX-RS)?

    从教材 RESTful Java with JAX RS 中我们可以读到 如果我们的应用程序服务器是 JAX RS 感知的 或者换句话说 与 JAX RS 紧密集成 则声明我们的ShoppingApplication作为 servlet 的
  • Camel JAX-RS 和跨域请求

    我希望能够在我的本地 Camel 实例上执行 HTTP 请求 仅出于开发目的 我知道这是不好的做法 现在 我坚持 Origin http localhost 8000 is not allowed by Access Control All
  • 如何在 Guice 中定义方法拦截器的顺序?

    有时需要知道 Guice 中拦截方法调用的方法拦截器的顺序 一个简单的示例场景是使用 guice persist 提供的 Transactional 方法拦截器和自定义 Retry 方法拦截器 重试拦截器必须在事务拦截器外部运行 以确保重试
  • JAX-WS 和 Guice 3

    是否有某种方法可以获取使用 JAX WS 创建的 SOAP Web 服务类 并使用 Guice 3 0 guice persist 事务或什至只是简单的依赖注入来注入它们 guiceyfruit 包提供了一个 GuiceManaged 注释
  • 如何在 REST(Jersey) 中创建过滤器或处理程序来包装 JAX-RS 请求?

    我的 jax rs 应用程序中有一些资源 我想在 jax rs 请求进入由 javax ws rs Path 注释的资源之前验证它 那么 我如何为我的资源创建处理程序或过滤器 我搜索了很多网站 他们的建议是使用代理或 servlet 过滤器
  • JAX-RS 多态 POST 请求:我应该如何编写 JSON?

    我在尝试用 JAX RS 解决这个问题时遇到了麻烦 我相信它与编组 解组过程有关 我认为我对此不太了解 并且我想重新创建这个 发帖的 REST 端点是 rest register 所以我的服务定义如下 ApplicationPath res
  • 为什么 HttpServletRequest 输入流为空?

    我有这段代码 我从请求输入流读取输入并使用 JacksonMapper 转换为 POJO 它在具有 guice 支持的 jetty 7 容器中运行 Override protected void doPost HttpServletRequ
  • pg_stat_activity 中具有“空闲”状态的持久“COMMIT”查询

    如果我查询 select from pg stat activity where application name example application 我得到了很多行 哪个州是idle查询是COMMIT 它们是持久的并且不会消失 一段时
  • 使用 Guice 优化注册表

    你好 今天思考了一种优化 有一些疑问 语境 我正在使用 Guice 2 进行 Java 开发 在我的网络应用程序中 我有一个转换器注册表 可以即时转换为某种类型 转换器描述如下 public class StringToBoolean im
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 具有默认值的 Java JAX-RS 自定义参数

    假设我有这个 这只是一个示例 GET Path value address Produces application json public Response getAddress QueryParam user User user 用户是
  • Resteasy 客户端的基本身份验证

    我正在尝试使用 REST 对在我的 jboss 上运行的登录模块执行基本身份验证 我已经找到了一个 StackOverflow 主题 它解释了如何使用凭据进行身份验证 RESTEasy 客户端框架身份验证凭据 https stackover
  • 为什么 dagger 被认为比 Guice 更适合 AWS lambda 实现?

    我知道 dagger 通过生成代码在编译时创建注入 因此它的性能比 Guice 更好 Guice 在运行时执行注入 但特别是对于 lambda 的情况 我看到在多个地方都提到 Dagger 是首选 是因为冷启动问题吗 由于lambda的冷启
  • 使用 JAX-RS 进行异步 REST 调用

    我需要创建一个 RESTful 服务 它应该以以下方式支持异步调用 当用户调用某个方法时 他会获得 http 202 代码和 url 来轮询 在其中他可以看到请求的状态 目前我使用 JAX RS 及其注释 Path public inter
  • 具有 CXF 和 Kerberos 身份验证的 Restful 服务

    尝试使用 Kerberos 身份验证保护现有 CXF JAX RS 服务时遇到困难 我浏览了似乎是参考文档的内容 http cxf apache org docs jaxrs kerberos html http cxf apache or
  • 使用 JaxRS 自定义 JSON 序列化

    在 Web 服务调用中 我想返回具有此 JSON 结构的对象 date 30 06 2014 price val 12 50 curr EUR 我想将此 JSON 代码映射到此 Java 结构 使用乔达时间 http www joda or
  • 与 google guice 相当的 clojure 是什么?

    我遇到了 google guice 但无法真正理解它以及它的作用 尽管它周围似乎有很多炒作 我希望从 clojure 的角度了解该库 以及为什么在 clojure 应用程序中需要 不需要它 以及该语言中是否内置了类似的内容 由于 Java
  • 使用 GIN 注入 Class

    有没有办法注入类类型Class
  • 注入实例上的 Guice 空指针异常

    我在 Jersey2 中使用 Guice 进行 DI 我想使用它 这样我就可以使用 Google App Engine gt 不使用 HK2 我的应用程序资源 public class ApplicationResource extends
  • 如何为 cxf jax-rs 2.0 客户端注册 jackson json 提供程序?

    我有一个 JAX RS 客户端正在发出一个简单的 GET 请求 我使用 CXF 实现和 Spring 进行 DI 呼叫成功 我收到响应代码 200 但是在将响应读入 POJO 时出现错误 例外 2015 05 08 16 11 55 457

随机推荐