2013-07-11 21 views
9

Wygląda na to, że Jersey 2.0 (używając apletu 3.1) nie jest w stanie zdekodować parametru, gdy właściwość charset jest określona w nagłówku .Jersey i @FormParam nie działają, gdy zestaw znaków jest określony w Content-Type

Na przykład biorąc pod uwagę następujący punkt końcowy:

@POST 
@Path("/hello") 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
@Produces(MediaType.APPLICATION_JSON) 
public Response hello(@FormParam("name") String name) { 
    System.out.println(name); 
    return ok(); 
} 

Ten curl żądanie działa:

curl -X POST -H "content-type: application/x-www-form-urlencoded" -d "name=tom" http://localhost:8080/sampleapp/hello 

Poniższa prośba zamiast nie pracy i parametr name jest null:

curl -X POST -H "content-type: application/x-www-form-urlencoded; charset=UTF-8" -d "name=tom" http://localhost:8080/sampleapp/hello 

Myślę, że dodatek do typu zawartości łamie mój kod.

EDIT:

Mam otwarty oficjalny bilet tylko w przypadku jest to błąd: https://java.net/jira/browse/JERSEY-1978

Odpowiedz

7

myślę, że to błąd.

Jest wniosek wyciągnąć otwarty na poparcie tej sprawy zastosowanie: https://github.com/jersey/jersey/pull/24/files

w międzyczasie sugeruję użyć filtru, aby usunąć kodowanie przestępstwa.

EDIT zgodnie OP komentuje

myślę o coś wzdłuż tych linii:

@Provider 
@PreMatching 
public class ContentTypeFilter implements ContainerRequestFilter{ 

    @Override 
    public void filter(ContainerRequestContext requestContext) 
      throws IOException { 
     MultivaluedMap<String,String> headers=requestContext.getHeaders(); 
     List<String> contentTypes=headers.remove(HttpHeaders.CONTENT_TYPE); 
     if (contentTypes!=null && !contentTypes.isEmpty()){ 
      String contentType= contentTypes.get(0); 
      String sanitizedContentType=contentType.replaceFirst(";.*", ""); 
      headers.add(HttpHeaders.CONTENT_TYPE, sanitizedContentType); 
     } 
    } 
} 
+2

Mam otwarty bilet https://java.net/jira/browse/JERSEY-1978 – Mark

+0

Jak mogę użyć filtru do modyfikowania 'Content-Type' nagłówek? – Mark

+0

Ja zmodyfikowałem odpowiedź. Jednak nie została przetestowana. –

4

Oto proste obejście zainspirowany postu Carlo. Jedyną modyfikacją jest dopasowanie "; charset = UTF-8 '; w przeciwnym razie "wieloczęściowe/dane formularzy; boundary = ... 'typy zawartości zawodzą.

// IMPLEMENTATION NOTE: Resolves an issue with FormParam processing 
// @see https://java.net/jira/browse/JERSEY-1978 

@Provider 
@PreMatching 
public class ContentTypeFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     MultivaluedMap<String,String> headers = requestContext.getHeaders(); 
     List<String> contentTypes = headers.remove(HttpHeaders.CONTENT_TYPE); 
     if (contentTypes != null && !contentTypes.isEmpty()) { 
      String contentType = contentTypes.get(0); 
      String sanitizedContentType = contentType.replaceFirst("; charset=UTF-8", ""); 
      headers.add(HttpHeaders.CONTENT_TYPE, sanitizedContentType); 
     } 
    } 
}