2011-11-29 70 views
4

我有两种方式使用的数据实体,我在页面加载时用一些数据填充表格,当您单击该列的一行时,我AJAX了解该项目的细节并将其显示在表单域中。我使用Spring-Roo在服务器端生成REST端点,在客户端生成Backbone.js。Spring-roo REST JSON控制器mangle日期字段

当表加载时,日期字段具有我期望的格式,直接从我的MySQL数据库(“yyyy-MM-dd”)。当我得到我的AJAX数据时,日期字段以Unix时间值的形式出现(例如“1323666000000”)。

我可以在客户端转换,但这是愚蠢的。任何想法如何让我的JSON控制器不这样做?

我试过把这些字段放到我的.java文件中,并且用@DateTimeFormat注解搞乱了,但我看不出有什么区别。

+0

也许不是你的情况,但...转换和表示日期应该在视图/输入层(浏览器或选择的视图技术:JSP,JSF ...)上完成。这是因为您通常需要考虑用户时区和区域设置来呈现它们。因此,您需要考虑在您的控制器中提供本地化的AJAX结果......或者在客户端执行。 – jjmontes

回答

4

您可以将日期转换为您希望用于您的JSON响应的任何格式。

对于您的情况,您一直使用java.util.Date类型字段的默认JSON日期变换器。这基本上是由Spring Roo为您生成的。看看你的* _Roo_Json方面,你会发现smth。像这样:

public java.lang.String PizzaOrder.toJson() { 
    return new JSONSerializer().exclude("*.class").serialize(this); 
} 

这样的实现使用flexjson.transformer.BasicDateTransformer类来为您转换日期。它是这样实现的:

public class BasicDateTransformer extends AbstractTransformer { 
    public void transform(Object object) { 
     getContext().write(String.valueOf(((Date) object).getTime())); 
    } 
} 

你想要的是使用一个不同的,更强大的变压器。幸运的是它带着你的Roo,叫做flexjson.transformer.DateTransformer。现在,为了正确设置日期格式,只需使用新变换器替换默认值即可。像这样:

public java.lang.String PizzaOrder.toJson() { 
    return new JSONSerializer().exclude("*.class") 
      .transform(new DateTransformer("MM/dd/yyyy"), Date.class) 
      .serialize(this); 
} 

这一切:-)

知道,你也可能适用不同的Date(而不是只)转换为不同的领域是这样的:

transform(new DateTransformer("MM/dd/yyyy"), "person.birthday") 

有关更多信息flexjson看看FLEXJSON project page

+0

太棒了!谢谢! –

相关问题