0

Я экспериментирую с использованием Джерси 2.17, пытающегося создать веб-службы RESTful, я читал Jersey User guide 2.17 и следил за инструкциями в главе 10 по созданию фильтров. Моя проблема в том, что фильтр работает отлично, когда ресурс вызывается из браузера, однако, когда я вызываю ресурс из тестового клиента Java Java, фильтр не запускается. , фильтр является PreMatching ContainerRequestFilter, есть ли у вас какие-либо идеи, если есть дополнительный параметр, необходимый для включения фильтра по всему ресурсу, я имею в виду заставить его работать, даже если вызов выполняется из тестового клиента, а не из браузера.Jersey ContainerRequestFilter работает только в режиме broswer

Это на 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()); 
    } 
} 

и это myApplicationFile:

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] 

ниже мой Test Client Code.

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 в качестве сервера.

+0

Можете ли вы показать код клиента. Вы проверили какие-либо исключения? Вы проверили статус ответа от кода клиента? –

+0

Также избавитесь от этого init-param 'com.sun.jersey.spi.container.ContainerRequestFilters'. Это мусор. Это только для Джерси 1.x –

+0

Я поделюсь клиентским кодом. , а для исключений я не получаю никаких исключений на стороне клиента или сервера, кажется, что Джерси игнорирует фильтр, если запрос, сделанный из ни одного приложения на основе браузера –

ответ

0

ОК, поэтому добавление анонимности @Provider в верхней части моего класса RequestFilter (до @PreMathcing) решило мою проблему.

спасибо peeskillet

Смежные вопросы