2016-11-29 4 views
4

Ich versuche APPLICATION_FORM_URLENCODED in einem MessageBodyReader in Jersey zu lesen. Der Strom kehrt Null-Daten, wenn ich versuche, es zu lesen unter Verwendung eines BufferedReaderInputStream gibt null Daten in MessageBodyReader Jersey

Hier ist mein Code:

@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public class EmployeeReader implements MessageBodyReader<Employee> { 

    @Override 
    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, 
     MediaType mediaType) { 
     return true; 
    } 

    @Override 
    public Employee readFrom(Class<Employee> type, Type genericType, Annotation[] annotations, 
     MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) 
     throws IOException, WebApplicationException { 
     System.out.println(entityStream.available()); //Prints 0 
     BufferedReader br = new BufferedReader(new InputStreamReader(entityStream)); 
     String data = br.readLine(); 
     System.out.println("Stream Read:"+data); 
     //data is null here 
     ..... 
    } 
} 

Ich kann sehen, dass die Daten von meiner Form als application/x-www-form-urlencoded in der POST-Anforderung gesendet wird, aber ich kann es nicht in meinem MessageBodyReader lesen.

Während Debuggen ich, dass der ByteChunk die unten Daten sehen hält:

POST /Employees/employee HTTP/1.1 
host:localhost:80800 
connection:keep-alivee 
content-length:144 
postman-token:cf873d98-3208-292c-8fc1-6da8138a31faa 
cache-control:no-cachee 
origin:chrome-extension://fhbjgbiflinjbdggehcddcbncdddomopp 
user-agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.366 
content-type:application/x-www-form-urlencodedd 
accept:*/** 
accept-encoding:gzip, deflate, brr 
accept-language:en-US,en;q=0.88 

id=3&name=Test 

UPDATE

ich gerade herausgefunden, dass es eine Art Nebenwirkung von SpringBootServletInitializer ist. Wenn Sie dies deaktivieren, funktioniert der obige Code einwandfrei.

Kann jemand helfen?

+0

erreicht, nicht als Nachrichtentext. – EJP

+0

@EJP Ich habe den gleichen Code für Jersey 2.5 in einer eigenständigen Jersey-Anwendung gesehen, funktioniert dieser Code nicht in Jersey 2.23 mit Spring Boot, Außerdem wie ich in der Frage erwähnt habe, kann ich die Daten sehen (Posted in der Frage) im ByteChunk des InputStreams in der Debug-Konsole ('id = 3 & name = Test') –

Antwort

4

Offenbar gibt es eine HiddenHttpMethodFilter, die getParameter vor einer Anfrage den Code für Formulardaten und eine POST Anfrage erfüllt. So wurde der InputStream bereits gelesen und br.readLine(); gab null zurück.

fand ich einen Weg, dies in einer der anderen Beiträgen So here

@Configuration 
public class FilterConfig { 
    @Bean 
    public HiddenHttpMethodFilter hiddenHttpMethodFilter() { 
     return new HiddenHttpMethodFilter() { 
      @Override 
      protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, 
        FilterChain filterChain) throws ServletException, IOException { 
       if ("POST".equals(request.getMethod()) 
         && request.getContentType().equals(MediaType.APPLICATION_FORM_URLENCODED)) { 
        //Skip this filter and call the next filter in the chain. 
        filterChain.doFilter(request, response); 
       } else { 
        //Continue with processing this filter. 
        super.doFilterInternal(request, response, filterChain); 
       } 
      } 
     }; 
    } 
} 

außer Kraft zu setzen, was dies tut, ist es einfach überprüft, ob die Anforderung von POST Typ ist, und wenn der Mediatype ist von APPLICATION_FORM_URLENCODED, wenn ja dann überspringen wir diesen Teil der Filterkette, sonst verarbeiten wir diesen Filter auch für alle anderen Anfragen.

Auf diese Weise die InputStream nicht gelesen werden, wenn es die POST-Parameter in einem Servlet als Anforderungsparameter kommen MessageBodyReader

Verwandte Themen