【问题标题】:Jersey Joda Time ISO 8601 parameter in urlencoded formJersey Joda Time ISO 8601 参数以 urlencoded 形式
【发布时间】:2013-10-17 02:57:48
【问题描述】:

我正在使用 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();
        }

    }
}

【问题讨论】:

    标签: jersey jodatime iso8601


    【解决方案1】:

    您可以使用下一个解决方案:

    @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. 有一个接受单个字符串参数的构造函数;

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

    4. 有一个注册的实现 javax.ws.rs.ext.ParamConverterProvider JAX-RS 扩展 SPI 返回一个 javax.ws.rs.ext.ParamConverter 实例,该实例能够“来自 string" 类型的转换。或

    5. 是 List、Set 或 SortedSet,其中 T 满足上述 2 或 3。 生成的集合是只读的。

    因此,可能的解决方案是 24。\

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

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

    或者使用ParamConverterProviderParamConverter

    【讨论】:

    • 感谢您的回复。当然。但我不能说服泽西岛为我做这件事吗?
    • @llya:谢谢。我必须先升级到 JAX-RS 2,但后来我选择了解决方案 4。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2012-12-11
    • 2010-10-24
    • 2017-02-01
    相关资源
    最近更新 更多