1

JBoss7.1とJava1.6を使用しています。

GuiceサービスをJAX-WSエンドポイントで統合したいと思います。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の配線をトリガーする役割を担うsinlgetonBeanです。必要なアノテーションクラスは次のとおりです

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

JAX-WSPOJOクラス

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

よろしくお願いしますDimitri

4

1 に答える 1

0

あなたの現在のアプローチ

コードでは、javax.interceptorアノテーション@Interceptor@InterceptorBindingおよび@AroundInvokeはGuiceではなくCDIおよびEJB標準でサポートされています。Guiceは、インターフェースを介して独自のAOPインターセプトをorg.aopalliance.intercept.MethodInterceptor使用し、メソッドを呼び出しますAbstractModule.bindInterceptor

したがって、エンドポイントでGuiceインジェクションをブートストラップしようとしています。

  1. エンドポイントのメソッドで非Guiceインターセプターを使用する
  2. メソッド内で@AroundInvoke、プログラムでGuiceを呼び出し、Injectorインジェクションターゲットがインターセプトされたエンドポイントになります

それはQを頼みます、1のために何を使うべきですか?

現在のアプローチのための「Bootrap」傍受メカニズム

明らかに、あなたが述べたように、EJBインターセプターは機能します。

EJBまたはGuiceAOPインターセプター以外の...明らかな代替手段は、標準の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してポートに対してエンドポイントインスタンスを設定します。以下に良い例を示します。

Webコンテナ外のJava6でJAX-WSでGuice3を使用する

于 2013-07-12T03:39:14.410 に答える