2013-10-09 9 views
5

我正在使用Jersey:1.17.1並定義了一個接受「application/x-www-form-urlencoded」的REST服務。我想接受ISO-8601格式的參數「b」,並讓Jersey將其映射到Joda DateTime。Jersey Joda時間以urlencode形式的ISO 8601參數

@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
編輯
Jersey Documentation

一般的Java類型的方法參數的可能:

  1. 一個原始類型;

  2. 有一個接受單個String參數的構造函數;

  3. 有(,Integer.valueOf(字符串)和 java.util.UUID.fromString(字符串)參見,例如)命名的valueOf或fromString靜態方法接受單個 字符串參數;

  4. 有一個註冊實施 javax.ws.rs.ext.ParamConverterProvider JAX-RS擴展SPI的是 能夠返回了一個「從 串」轉換的javax.ws.rs.ext.ParamConverter實例類型。或

  5. 是List,Set或SortedSet,其中T滿足上述2或3。 生成的集合是隻讀的。

所以,posssible解決方案和。\

創建類ISODateAsString和用途是作爲參數

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

或者使用ParamConverterProviderParamConverter

+0

感謝您的回覆。當然。但我不能說服澤西爲我做這件事嗎? – Ronald

+0

@Ronald答案編輯 – Ilya

+0

@llya:謝謝。我不得不先升級到JAX-RS 2,但隨後我解決了解決方案4。 – Ronald