将Guice注入JAX-WS POJO

时间:2013-03-06 14:09:21

标签: jboss jax-ws guice

我正在使用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是一个负责触发guice接线的sinlgeton bean。所需的注释类如下

@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);
  }
}

提前致谢 迪米特里

1 个答案:

答案 0 :(得分:0)

您当前的方法

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

所以你试图通过以下方式在端点上引导Guice注入:

  1. 在端点的方法
  2. 上使用非Guice拦截器
  3. @AroundInvoke方法中,以编程方式调用Guice Injector,注入目标为截获的端点
  4. 那要求Q,1用什么?

    用于当前方法的

    'Bootrap'拦截机制

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

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

    但这会让它变成圆形和重量级......为什么只使用CDI来提升,这样你就可以配置并执行你想要的DI竞争对手:Guice?

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

    如果你想要POJO网络服务,也许可以考虑回溯一点,而不是拦截驱动的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