2016-12-16 14 views
0

は、私は、Java EE/EJB/JAX-RSに次のコードを持っていると仮定しますのJava EE - メソッドにメソッドのパラメータを注入する方法カスタム注釈付き

私はカスタム@MyAnnotation注釈が存在するかどうかをチェックするにはどうすればよいです注釈が存在する場合のいくつかの要求コンテキストパラメータに基づいてCustomValue valueメソッドパラメータを設定しますか?

注:私はすでにHandlerInterceptorAdapterHandlerMethodArgumentResolverを使用して春にこのコードを持っています。今私は春を使わずに同じことをする必要があります。私は既にContainerRequestFilterを発見しました。私はそれを使って注釈をチェックしますが、今はメソッドのパラメータを注入するのに苦労しています。

答えて

0

カスタムメソッドのパラメータの注射は、通常は異なる(すなわち、フィールド、コンストラクタ)注射を少し処理されます。 Jerseyでは、これにはValueFactoryProviderの実装が必要です。

    :あなたのケースのためにそれは次にあなたも this Gist

    を参照して、完全な例を参照してくださいResourceConfig

    public class AppConfig extends ResourceConfig { 
        public AppConfig() { 
         register(new AbstractBinder() { 
           @Override 
           protected void configure() { 
            bind(MyAnnotationParamValueProvider.class) 
             .to(ValueFactoryProvider.class) 
             .in(Singleton.class); 
           } 
         }); 
        } 
    } 
    

    に登録する必要があります

    public class MyAnnotationParamValueProvider implements ValueFactoryProvider { 
    
        @Inject 
        private ServiceLocator locator; 
    
        @Override 
        public Factory<?> getValueFactory(Parameter parameter) { 
         if (parameter.getAnnotation(MyAnnotation.class) != null 
           && parameter.getRawType() == CustomValue.class) { 
          final Factory<CustomValue> factory 
            = new AbstractContainerRequestValueFactory<CustomValue>() { 
           @Override 
           public CustomValue provide() { 
            final ContainerRequest request = getContainerRequest(); 
            final String value = request.getHeaderString("X-Value"); 
            return new CustomValue(value); 
           } 
          }; 
          locator.inject(factory); 
          return factory; 
         } 
         return null; 
        } 
    
        @Override 
        public PriorityType getPriority() { 
         return Priority.NORMAL; 
        } 
    } 
    

    のようになります。

  • Custom Method Parameter Injection with Jersey。これは、明示的に注入する必要のない別の方法を示しています。また、3つの領域(フィールド、コンストラクタ、メソッドparam)のすべてに値を注入することもできます。
+0

は答えてくれてありがとう! :)例えば、注釈を使って、ResourceConfigクラスなしでこれを行う方法はありますか?私は管理しなければならないSwiftとの仕事は私を柔らかくしました...:D –

+0

あなたはweb.xml(およびパッケージスキャン)を使用していますか?その場合は、[この記事を]チェックアウト(http://stackoverflow.com/a/29275727/2587435) –

+0

いや、いやweb.xmlの...なしパッケージスキャン。しかし、[このポスト](http://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/)に基づいて、私はパッケージのスキャンをコードで設定することができると信じています私はそれを撃つだろう。 :) ありがとうございました! –

関連する問題