Jersey ContainerRequestFilter 仅在浏览器模式下工作

Jersey ContainerRequestFilter is only working in broswer Mode

我正在尝试使用 Jersey 2.17 尝试创建 RESTful Web 服务,我阅读了 Jersey User guide 2.17 并按照第 10 章中的说明创建过滤器,我的问题是过滤器正在工作当从浏览器调用资源时非常完美,但是当我从 java SE 测试客户端调用资源时,过滤器不会被触发。 ,过滤器是 PreMatching ContainerRequestFilter,您是否知道是否需要额外的设置才能在整个资源中启用过滤器,我的意思是即使调用是从测试客户端而不是浏览器进行的,也要让它工作。

这是通过 requestFilter

package com.vogella.jersey.fist;

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.Response;

@PreMatching
public class RequestFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext arg0) throws IOException {
        System.out.println(" Media Type : "+arg0.getMediaType());
        System.out.println("Method Type : "+arg0.getMethod());
        System.out.println("Method length : "+arg0.getLength());
        System.out.println("request time : "+arg0.getDate());
        System.out.println(" message : "+arg0.toString());
        arg0.abortWith(Response
                .status(Response.Status.UNAUTHORIZED)
                .entity("User cannot access the resource.")
                .build());
    }
}

这是我的应用程序文件:

package com.vogella.jersey.fist;

import javax.ws.rs.ApplicationPath;

import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("/")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
        // Resources.
        packages(Hello.class.getPackage().getName());

        // register(LoggingFilter.class);
        register(RequestFilter.class);
        //  register(ResponseFilter.class);
    }
}

最后这是我的 web.xml:

[<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>com.vogella.jersey.first</display-name>
 <servlet>
    <servlet-name>MyApplication</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
     <!-- Register resources and providers under com.vogella.jersey.first package. -->
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.vogella.jersey.fist</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
        <param-value>com.vogella.jersey.fist.RequestFilter</param-value>
    </init-param> 
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>MyApplication</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
</web-app>][2] 

下面是我的测试客户端代码。

ClientConfig config = new ClientConfig();

Client client = ClientBuilder.newClient(config);
// client.register(MyJAXBContextProvider.class);
WebTarget service = client.target(UriBuilder.fromUri("http://localhost:8080/com.vogella.jersey.fist").build());
        System.out.println(service.path("rest").path("todo").request().accept(MediaType.TEXT_HTML).get(String.class));

Todo a = service.path("rest").path("todo").request().accept(MediaType.APPLICATION_XML).get(Todo.class) ; 
        System.out.println(a.getDescription());

谁能告诉我如何解决这个问题? PS : 我正在使用 TomCat8 作为服务器。

好的,所以在我的 RequestFilter class 顶部添加 @Provider 注释(在 @PreMathcing 之前)解决了我的问题。

谢谢你 peeskillet