7

Jersey Web サイトの入門ガイドに従ってください。

次のビルド コマンドを実行しました。

$ mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 \
-DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false \
-DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example \
-DarchetypeVersion=2.2

次に、チュートリアルに従いました

https://jersey.java.net/documentation/latest/filters-and-interceptors.html#d0e6783

カスタム ContainerResponseFilter を追加するには:

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
static @interface CORSBinding {}

@Provider
@Priority(Priorities.HEADER_DECORATOR)
@CORSBinding
static class CrossDomainFilter implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext creq, ContainerResponseContext cres) {
        Logger.getLogger("com.example").log( Level.INFO, "before: {0}", cres.getHeaders());
        cres.getHeaders().add("Access-Control-Allow-Origin", "*");
        cres.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
        cres.getHeaders().add("Access-Control-Allow-Credentials", "true");
        cres.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        cres.getHeaders().add("Access-Control-Max-Age", "1209600");
        Logger.getLogger("com.example").log( Level.INFO, "after: {0}", cres.getHeaders());
    }
}

@Provider
static class MyResponseFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        System.out.println("MyResponseFilter.postFilter() enter");
        responseContext.setEntity(
                responseContext.getEntity() + ":" + getClass().getSimpleName(), null, MediaType.TEXT_PLAIN_TYPE);
        System.out.println("MyResponseFilter.postFilter() exit");
    }
}

...
@GET
@Produces(MediaType.TEXT_PLAIN)
@CORSBinding
public String helloWorld() {
    return "hello world";
}

このフィルターを名前付きバインディングと動的バインディングに登録しようとしましたが、何も機能しません。

簡単に再現するために、公式リソースの例も試しました。

https://github.com/jersey/jersey/tree/2.2/examples/exception-mapping

同じ問題: カスタム フィルターが実行されません。

これはグリズリーの問題ですか?

4

2 に答える 2

7

Tomcatコンテナを使用してweb.xmlに次のコードを追加すると、うまくいきました:

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>my.package.SecurityRequestFilter;org.glassfish.jersey.filter.LoggingFilter</param-value>
</init-param>`

私の感謝は次のとおりです。

http://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/

于 2015-01-21T13:53:37.837 に答える