2

私は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 管理のアスペクトに注入する方法はありますか?

4

0 に答える 0