1

我正在使用 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);
  }
}

在此先感谢迪米特里

4

1 回答 1

0

您当前的方法

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

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

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

那求问,1 用什么?

您当前方法的“引导”拦截机制

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

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

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

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

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

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

端点.发布 javadoc

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

在 Web 容器外的 Java 6 中使用带有 JAX-WS 的 Guice 3

于 2013-07-12T03:39:14.410 回答