2013-10-09 10 views
5

Używam Jersey: 1.17.1 i zdefiniowałem usługę REST akceptującą "application/x-www-form-urlencoded". Chciałbym zaakceptować parametr "b" w formacie ISO-8601 i pozwolić Jersey na odwzorowanie tego na Joda DateTime.Parametr ISO 8601 dla Jersey Joda w formie urnowej

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

ale otrzymuję ten wyjątek

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) 

Co muszę zrobić, aby tę pracę?

A odpowiedź brzmi: raz pierwszy zaktualizowany do JAX-RS 2.0, a następnie wykorzystywane:

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

    } 
} 

Odpowiedz

2

Można użyć następne rozwiązanie:

@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() ma format yyyyMMdd.
odpowiednim formacie do sprawy można znaleźć here
EDIT
Od Jersey Documentation

Ogólnie typ Java parametru metoda może:

  1. Bądź prymitywny typ;

  2. Mieć konstruktor, który akceptuje pojedynczy argument String;

  3. mieć stały sposób nazwie valueOf lub fromString który przyjmuje pojedyncze argumencie (patrz, na przykład, Integer.valueOf (ciąg) i java.util.UUID.fromString (ciąg));

  4. posiada zarejestrowanej realizację javax.ws.rs.ext.ParamConverterProvider przedłużacza JAX-RS SPI że zwraca instancję javax.ws.rs.ext.ParamConverter zdolny do „z string” konwersji do rodzaj. lub

  5. Lista, Zestaw lub Sortowanie, gdzie T spełnia 2 lub 3 powyżej. Wynikowa kolekcja jest tylko do odczytu.

Więc posssible rozwiązania są i . \

Tworzenie klasy ISODateAsString i stosowanie jest jako parametr

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

Albo użyć ParamConverterProvider i ParamConverter

+0

Dziękuję za odpowiedź. Pewnie. Ale czy nie mogę przekonać Jersey, żeby zrobiła to za mnie? – Ronald

+0

@Ronalda jest edytowana – Ilya

+0

@llya: Dzięki. Najpierw musiałem zaktualizować do JAX-RS 2, ale potem skorzystałem z rozwiązania 4. – Ronald

Powiązane problemy