【问题标题】:Injecting Guice into JAX-WS POJO将 Guice 注入 JAX-WS POJO
【发布时间】:2013-03-06 14:09:20
【问题描述】:

我正在使用 JBoss 7.1 和 Java 1.6。

我想通过 JAX-WS 端点集成 Guice 服务。使用 Gunnar.Morling 描述的拦截器模式,当使用无状态 bean 作为 Web 服务时,我能够正确实例化 Guice 模块。但是,我无法使用简单的 POJO 注释 web 服务来做同样的事情。这可能有没有人找到解决方法。以下是我迄今为止所做的努力的总结。

@UsesGuice @Interceptor
public class GuiceInterceptor {

  @Inject
  private GuiceInjectorHolderBean injectorHolder;

  @AroundInvoke
  public Object aroundAdvice(final InvocationContext ctx) throws Exception {
    if (ctx.getTarget().getClass().isAnnotationPresent(UsesGuice.class)) {
        final Injector injector = injectorHolder.getInjector();
        injector.injectMembers(ctx.getTarget());
    }
    return ctx.proceed();
  }
}

GuiceInjectorHolderBean 是一个单根 bean,负责触发 guice 连接。需要的注解类如下

@Retention(RUNTIME)
@Target(TYPE) 
@InterceptorBinding 
public @interface UsesGuice {}

JAX-WS POJO 类

@UsesGuice
@WebService(serviceName = "EchoServiceService", portName = "EchoServicePort", ame = "EchoServiceImpl", targetNamespace = "lala")
public class EchoServiceImpl implements EchoService
{
  @Inject
  MyGuiceInjection injection;

  @Override
  @WebMethod
  public String sayHello(final String msg)
  {
    return "Hello " + injection.call(msg);
  }
}

提前致谢 迪米特里

【问题讨论】:

    标签: jboss jax-ws guice


    【解决方案1】:

    你目前的方法

    在您的代码中,javax.interceptor 注释 @Interceptor@InterceptorBinding@AroundInvoke 受 CDI 和 EJB 标准支持,而不是 Guice。 Guice 通过org.aopalliance.intercept.MethodInterceptor 接口使用专有的AOP 拦截并调用AbstractModule.bindInterceptor 方法。

    因此,您尝试通过以下方式在端点上引导 Guice 注入:

    1. 在端点方法上使用非Guice拦截器
    2. @AroundInvoke 方法中,以编程方式调用Guice Injector,注入目标是拦截的端点

    求问,1 用什么?

    当前方法的“Bootrap”拦截机制

    显然,正如您所说,EJB 拦截器可以工作。

    除了 EJB 或 Guice AOP 拦截器...一个明显的替代方案是标准的 CDI 拦截器。

    但这会使这一切变得相当循环和重量级......为什么只使用 CDI 来提升,以便您可以配置和执行您想要的 DI 竞争对手:Guice?

    建议的替代解决方案 - 手动端点实例初始化的 JAX-WS 支持

    如果你想要 POJO web 服务,也许可以考虑回溯一点,而不是拦截器驱动的 Guice 初始化,也许这可能是你需要的:

     javax.xml.ws.Endpoint.publish(String address, Object implementor)
    

    Endpoint.publish javadoc

    以标准方式初始化 Guice,使用injector.getInstance() 构造您的端点实例,然后使用Endpoint.publish 将端点实例设置为针对端口。下面给出了一个很好的例子:

    Using Guice 3 with JAX-WS in Java 6 outside web container

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      相关资源
      最近更新 更多