2013-10-09 12 views
5

Sto utilizzando Jersey: 1.17.1 e definito un servizio REST che accetta "application/x-www-form-urlencoded". Vorrei accettare un parametro "b" nel formato ISO-8601 e lasciare che Jersey lo mappi a un Joda DateTime.Jersey Joda Time Parametro ISO 8601 in formato urlencoded

@PUT 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public Response createTask(@FormParam("a") String a, @FormParam("b") DateTime b) { 
... 

ma sto ottenendo questa eccezione

SEVERE: The following errors and warnings have been detected with resource and/or provider classes: 
SEVERE: Missing dependency for method public de.ast.mae.rest.util.response.Response de.ast.mae.rest.service.tasks.TasksAdminRestService.createTask(java.lang.String,org.joda.time.DateTime) at parameter at index 6 
SEVERE: Missing dependency for method public de.ast.mae.rest.util.response.Response de.ast.mae.rest.service.tasks.TasksAdminRestService.createTask(java.lang.String,org.joda.time.DateTime) at parameter at index 6 
SEVERE: Method, public de.ast.mae.rest.util.response.Response de.ast.mae.rest.service.tasks.TasksAdminRestService.createTask(java.lang.String,java.lang.String,org.joda.time.DateTime), annotated with PUT of resource, class de.ast.mae.rest.service.tasks.TasksAdminRestService, is not recognized as valid resource method. 
Okt 09, 2013 5:54:41 PM com.sun.jersey.spi.spring.container.servlet.SpringServlet initiate 
SEVERE: Exception occurred when intialization 
com.sun.jersey.spi.inject.Errors$ErrorMessagesException 
at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170) 
at com.sun.jersey.spi.inject.Errors.postProcess(Errors.java:136) 

Che cosa devo fare per fare questo lavoro?

E la risposta è: ho aggiornato a JAX-RS 2.0 e poi utilizzato:

@Provider 
public class DateTimeParamConverterProvider implements ParamConverterProvider { 

    @Override 
    public <T> ParamConverter<T> getConverter(Class<T> type, Type genericType, Annotation[] annotations) { 
     if (type.equals(DateTime.class)) { 
      return (ParamConverter<T>) new DateTimeParamConverter(); 
     } else { 
      return null; 
     } 

    } 

    private static class DateTimeParamConverter implements ParamConverter<DateTime> { 
     @Override 
     public DateTime fromString(String value) { 
      try { 
       return ISODateTimeFormat.dateTimeNoMillis().parseDateTime(value); 
      } catch (IllegalArgumentException e) { 
       return ISODateTimeFormat.dateTime().parseDateTime(value); 
      } 
     } 

     @Override 
     public String toString(DateTime value) { 
      return value.toString(); 
     } 

    } 
} 

risposta

2

È possibile utilizzare soluzione successiva:

@PUT 
@Produces(MediaType.APPLICATION_JSON) 
@Consumes(MediaType.APPLICATION_FORM_URLENCODED) 
public Response createTask(@FormParam("a") String a, @FormParam("b") String b) 
{ 
    final DateTime date = ISODateTimeFormat.basicDate().parse(b); 
    // ... 

basicDate() ha formato yyyyMMdd.
formato appropriato al vostro caso è possibile trovare here
EDIT
Da Jersey Documentation

In generale il tipo Java del parametro del metodo può:

  1. essere un tipo primitivo;

  2. Avere un costruttore che accetta un argomento String singolo;

  3. avere un metodo statico denominato valueOf o fromstring che accetta un singolo argomento String (vedi, per esempio, Integer.valueOf (String) e java.util.UUID.fromString (String));

  4. avere un'implementazione registrato di javax.ws.rs.ext.ParamConverterProvider JAX-RS estensione SPI che restituisce un'istanza javax.ws.rs.ext.ParamConverter capace di una conversione "da stringa" per la genere. oppure

  5. Essere Elenco, Impostare o Ordina set, dove T soddisfa 2 o 3 sopra. La raccolta risultante è di sola lettura.

Quindi, le soluzioni posssible sono e . \

Crea classe ISODateAsString e l'uso è come parametro di

public class ISODateAsString 
{ 
    DateTime dateTime; 
    public DateAsString(String date) 
    { 
     dateTime= ISODateTimeFormat.basicDate().parse(date); 
    } 
    //... 
} 

Oppure utilizzare ParamConverterProvider e ParamConverter

+0

Grazie per la risposta. Sicuro. Ma non posso convincere Jersey a fare questo per me? – Ronald

+0

@Risposta risposta modificata – Ilya

+0

@llya: Grazie. Ho dovuto prima passare a JAX-RS 2, ma poi sono andato con la soluzione 4. – Ronald

Problemi correlati