2013-07-11 8 views
9

Sembra che Jersey 2.0 (utilizzando servlet 3.1) non sia in grado di decodificare un parametro quando la proprietà charset è specificata nell'intestazione Content-Type.Jersey e @FormParam non funzionano quando il set di caratteri è specificato nel Content-Type

ad esempio sulla base dei seguenti endpoint:

@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(); 
} 

Questo ricciolo richiesta funziona:

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

La seguente richiesta invece non lavoro e il parametro name è null:

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

Penso che l'aggiunta charset=UTF-8 nel tipo di contenuto rompa il mio codice.

EDIT:

Ho aperto un biglietto ufficiale nel caso in cui questo è un bug: https://java.net/jira/browse/JERSEY-1978

risposta

7

Penso che sia un bug.

C'è una richiesta di pull aperta a sostegno di questo caso d'uso: https://github.com/jersey/jersey/pull/24/files

Nel frattempo io suggerirei di usare un filtro per rimuovere la codifica incriminato.

EDIT secondo OP commenti

Sto pensando a qualcosa in queste righe:

@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

Ho aperto un biglietto https://java.net/jira/browse/JERSEY-1978 – Mark

+0

Come posso utilizzare un filtro per modificare l'intestazione 'Content-Type'? – Mark

+0

Ho modificato la risposta. Non è testato, però. –

4

Ecco un semplice work-around ispirato post di Carlo. L'unica modifica è far corrispondere '; charset = UTF-8' ; altrimenti, "multipart/form-data; boundary = ... 'i tipi di contenuto falliscono.

// 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); 
     } 
    } 
} 
Problemi correlati