【问题标题】:Spring-roo REST JSON controllers mangle date fieldsSpring-roo REST JSON 控制器处理日期字段
【发布时间】:2023-03-27 03:25:02
【问题描述】:

我有一个数据实体,我以两种方式使用它,当页面加载时,我用它的一些数据填充一个表,当你单击该列的一行时,我 AJAX 了该项目的详细信息并显示它们在表单字段中。我在服务器端使用 Spring-Roo 生成的 REST 端点,在客户端使用 Backbone.js。

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

我可以在客户端转换它,但这很愚蠢。知道如何让我的 json 控制器不这样做吗?

我尝试将这些字段推送到我的 .java 文件中,并弄乱了 @DateTimeFormat 注释,但我看不出有什么区别。

【问题讨论】:

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

标签: ajax json date spring-roo


【解决方案1】:

您可以将日期转换为任何您想要的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-28
    • 2018-02-28
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多