泽西岛乔达时间ISO 8601参数,采用代码编码形式 [英] Jersey Joda Time ISO 8601 parameter in urlencoded form

查看:194
本文介绍了泽西岛乔达时间ISO 8601参数,采用代码编码形式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using Jersey: 1.17.1 and defined a REST service accepting "application/x-www-form-urlencoded". I would like to accept a parameter "b" in ISO-8601 format and let Jersey map this to a 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)

我需要做些什么才能使它起作用?

What do I need to do to make this work?

答案是:我首先升级到JAX-RS 2.0,然后使用:

And the answer is: I first upgraded to JAX-RS 2.0 and then used:

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

    }
}

推荐答案

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

You can use next solution:

@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.
您可以在此处找到适合您情况的适当格式
编辑
来自 Jersey文档

basicDate() has format yyyyMMdd.
Appropriate format to your case you can find here
EDIT
From Jersey Documentation

通常,方法参数的Java类型可以:

In general the Java type of the method parameter may:

  1. 是原始类型;

  1. Be a primitive type;

具有一个接受单个String参数的构造函数;

Have a constructor that accepts a single String argument;

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

Have a static method named valueOf or fromString that accepts a single String argument (see, for example, Integer.valueOf(String) and java.util.UUID.fromString(String));

已注册实现 javax.ws.rs.ext.ParamConverterProvider JAX-RS扩展SPI 返回一个能够来自"的javax.ws.rs.ext.ParamConverter实例 类型的字符串"转换.或

Have a registered implementation of javax.ws.rs.ext.ParamConverterProvider JAX-RS extension SPI that returns a javax.ws.rs.ext.ParamConverter instance capable of a "from string" conversion for the type. or

是列表,集合或排序集合,其中T满足上述2或3. 结果集合是只读的.

Be List, Set or SortedSet, where T satisfies 2 or 3 above. The resulting collection is read-only.

因此,可能的解决方案是 2 4 .\

So, posssible solutions are 2 and 4.\

创建类ISODateAsString并将其用作参数

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

或使用ParamConverterProviderParamConverter

这篇关于泽西岛乔达时间ISO 8601参数,采用代码编码形式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆