在apache cxf中使用jax-rs自定义日期格式?

时间:2010-05-14 23:42:57

标签: cxf jax-rs

当我在apache CXF上使用jax-rs时,我一直在谷歌上搜索如何自定义日期格式。我查看了代码,似乎它只支持原语,枚举和一个特殊的hack,假设与@FormParam相关的类型有一个带有单个字符串参数的构造函数。如果我想使用FormParam,这会强制我使用String而不是Date。它有点难看。有没有更好的方法呢?

@POST
@Path("/xxx")
public String addPackage(@FormParam("startDate") Date startDate)
    {
      ...
    } 

由于

4 个答案:

答案 0 :(得分:4)

从CXF 2.3.2开始注册ParameterHandler就可以了。也可以使用RequestHandler过滤器覆盖日期值(作为查询的一部分传递等),以使默认日期(字符串)起作用

答案 1 :(得分:4)

一个简单的apporach是将参数作为String并在方法体中解析它以将其转换为java.util.Date

另一个是创建一个具有构造函数的类接受String类型的参数。执行我在第一种方法中讲述的相同的事情。

这是第二种方法的代码。

@Path("date-test")
public class DateTest{

    @GET
    @Path("/print-date")
    public void printDate(@FormParam("date") DateAdapter adapter){
        System.out.println(adapter.getDate());
    }

    public static class DateAdapter{
        private Date date;
        public DateAdapter(String date){
            try {
                this.date = new SimpleDateFormat("dd/MM/yyyy").parse(date);
            } catch (Exception e) {

            }
        }

        public Date getDate(){
            return this.date;
        }
    }
}

希望这有帮助。

答案 2 :(得分:0)

在读取CXF代码(2.2.5)之后,它是不可能的,并且使用Date(String)构造函数进行硬编码,因此无论Date(String)支持什么。

答案 3 :(得分:0)

在Apache-cxf 3.0中,您可以使用ParamConverterProvider将参数转换为Date

以下代码是从my answer to this question复制的。

public class DateParameterConverterProvider implements ParamConverterProvider {

    @Override
    public <T> ParamConverter<T> getConverter(Class<T> type, Type type1, Annotation[] antns) {
        if (Date.class.equals(type)) {
            return (ParamConverter<T>) new DateParameterConverter();
        }
        return null;
    }

}

public class DateParameterConverter implements ParamConverter<Date> {

    public static final String format = "yyyy-MM-dd"; // set the format to whatever you need

    @Override
    public Date fromString(String string) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        try {
            return simpleDateFormat.parse(string);
        } catch (ParseException ex) {
            throw new WebApplicationException(ex);
        }
    }

    @Override
    public String toString(Date t) {
        return new SimpleDateFormat(format).format(t);
    }

}