2013-10-09 6 views
5

Ich benutze Jersey: 1.17.1 und definiert einen REST-Service, der "application/x-www-form-urlencoded" akzeptiert. Ich würde gerne einen Parameter "b" im ISO-8601-Format akzeptieren und Jersey auf eine Joda DateTime abbilden lassen.Jersey Joda Zeit ISO 8601 Parameter in urlencoded Form

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

aber ich erhalte diese Ausnahme

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) 

Was muss ich tun, um diese Arbeit zu machen?

Und die Antwort lautet: ich zuerst 2,0 bis JAX-RS aufgerüstet und dann verwendet:

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

    } 
} 

Antwort

2

Sie nächste Lösung verwenden können:

@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() hat Format yyyyMMdd.
geeignetes Format zu Ihrem Fall, dass Sie here
EDIT
Von Jersey Documentation

Im Allgemeinen ist der Java-Typ des Verfahrensparameters kann finden:

  1. , der eine primitive Art;

  2. Haben Sie einen Konstruktor, der ein einzelnes String-Argument akzeptiert;

  3. haben eine statische Methode valueOf oder vonString genannt, die ein einzelnes String-Argument annimmt (siehe zum Beispiel Integer.valueOf (String) und java.util.UUID.fromString (String));

  4. müssen eine registrierter Umsetzung javax.ws.rs.ext.ParamConverterProvider JAX-RS Erweiterung SPI dass eine Instanz javax.ws.rs.ext.ParamConverter kehrt die Lage einer „von string“ Umwandlung für die Art. oder

  5. Be List, Set oder SortedSet, wobei T 2 oder 3 erfüllt. Die resultierende Sammlung ist schreibgeschützt.

So posssible Lösungen sind und . \

erstellen Klasse ISODateAsString und Verwendung als Parameter

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

Oder ParamConverterProvider ist verwenden und ParamConverter

+0

Danke für deine Antwort. Sicher. Aber kann ich Jersey nicht dazu überreden, das für mich zu tun? – Ronald

+0

@Ronald Antwort ist bearbeitet – Ilya

+0

@llya: Danke. Ich musste zuerst auf JAX-RS 2 upgraden, dann bin ich mit Lösung 4 gegangen. – Ronald