私はSpring 5.2.xとJersey 2.30.x for JAX-RSを使用しています。
次のような注釈があります。
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
}
私のサービスでは、この注釈を次のように使用します。
@Service
public class MyService {
@MyAnnotation
public Response get() {
...
}
}
@MyAnnotation
注釈が存在するときに特定のロジックを実行したい。このために、アスペクトを作成しました。
@Aspect
@Component
public class MyAspect {
@Context
private ContainerRequest request;
@Pointcut("@annotation(so.MyAnnotation)")
public void annotated() {
}
@Before("annotated()")
public void test() {
System.out.println("I need access to the HTTP headers: " + request);
}
}
この側面では、HTTP ヘッダーにアクセスする必要があります。Jersey の を注入しようとContainerRequest
しましたが、これは失敗したようです。参照は常にnull
です。
私の質問はContainerRequest
、Spring のマネージド Bean でなどの Jersey のコンテキスト オブジェクトにアクセスするにはどうすればよいかということです。
最小限の例
最小限の例を作成しました。 https://github.com/pbillen/playground-so-61750237を参照してください。でビルドしてmvn clean install -U
から、Tomcat コンテナを起動できmvn cargo:run
ます。ブラウザでhttp://localhost:8080/にアクセスすると、コンソールに次のように表示されます。
I need access to the HTTP headers: null
Jersey をバイパスして使用することによる実用的なソリューションHttpServletRequest
アスペクトで配線してから、ヘッダーHttpServletRequest
にアクセスしてみました:Authorization
@Aspect
@Component
public class MyAspect {
@Autowired
private HttpServletRequest request;
@Pointcut("@annotation(so.MyAnnotation)")
public void annotated() {
}
@Before("annotated()")
public void test() {
System.out.println(request.getHeader("authorization"));
}
}
私も追加しましたweb.xml
:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
これは基本的にジャージーを完全にバイパスします。Authorization
これは機能しているようで、アスペクトでヘッダーを読み取ることができるようになりました。すごい!
しかし、私の疑問はまだ残っています。Jersey のコンテキスト オブジェクトを Spring 管理のアスペクトに注入する方法はありますか?