2013-10-09 2 views
5

Я использую Джерси: 1.17.1 и определил услугу REST, принимающую «application/x-www-form-urlencoded». Я хотел бы принять параметр «b» в формате ISO-8601 и позволить Джерси отобразить это на дату Joda DateTime.Джерси Joda Time ISO 8601 параметр в urlencoded форме

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

, но я получаю это исключение

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) 

Что мне нужно сделать, чтобы сделать эту работу?

И ответ: я первым повышен до JAX-RS 2.0, а затем использовали:

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

    } 
} 

ответ

2

Вы можете использовать следующее решение:

@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() имеет формат yyyyMMdd.
Соответствующий формат для вашего дела вы можете найти here
EDIT
От Jersey Documentation

В целом тип Java параметра метода может:

  1. примитивный тип;

  2. Имейте конструктор, который принимает единственный аргумент String;

  3. Есть статический метод valueOf или fromString, который принимает один аргумент типа String (см, например, Integer.valueOf (String) и java.util.UUID.fromString (String));

  4. Иметь зарегистрированную реализацию javax.ws.rs.ext.ParamConverterProvider расширения JAX-RS SPI, который возвращает экземпляр javax.ws.rs.ext.ParamConverter, способный преобразования «из строки» для тип. или

  5. Be List, Set or SortedSet, где T удовлетворяет 2 или 3 выше. Полученная коллекция доступна только для чтения.

Итак, posssible решения и . \

Создать класс ISODateAsString и использование в качестве параметра

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

Или используйте ParamConverterProvider и ParamConverter

+0

Спасибо за ваш ответ. Конечно. Но разве я не могу убедить Джерси сделать это для меня? – Ronald

+0

@Ronald ответ отредактирован – Ilya

+0

@llya: Спасибо. Сначала мне нужно было перейти на JAX-RS 2, но потом я пошел с решением 4. – Ronald

 Смежные вопросы

  • Нет связанных вопросов^_^