泽西Joda时间以urlencoded形式的ISO 8601参数

时间:2013-10-09 16:13:47

标签: jersey jodatime iso8601

我正在使用Jersey:1.17.1并定义了一个接受“application / x-www-form-urlencoded”的REST服务。我想接受ISO-8601格式的参数“b”,让Jersey将它映射到Joda DateTime。

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

    }
}

1 个答案:

答案 0 :(得分: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.   
  3. 有一个接受单个String参数的构造函数;

  4.   
  5. 使用名为valueOf的静态方法或接受单个的fromString   字符串参数(例如,参见Integer.valueOf(String)和   java.util.UUID.fromString(字符串));

  6.   
  7. 已注册实施   javax.ws.rs.ext.ParamConverterProvider JAX-RS扩展SPI   返回一个能够“from”的javax.ws.rs.ext.ParamConverter实例   字符串“转换为类型。或

  8.   
  9. Be List,Set或SortedSet,其中T满足上面的2或3。   生成的集合是只读的。

  10.   

所以,可能的解决方案是 2 4 。\

创建类ISODateAsString并使用is作为参数

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

或使用ParamConverterProviderParamConverter