Bra*_*ace 2 json jodatime playframework deserialization playframework-2.0
我无法弄清楚允许在我的应用中为DateTime字段发布JSON的神奇字词.查询时,DateTimes从自纪元开始返回为微秒.当我尝试以那种格式发布({"started":"1341006642000","task":{"id":1}})时,我得到"无效的值:已启动".
我也尝试添加@play.data.format.Formats.DateTime(pattern="yyyy-MM-dd HH:mm:ss")到该started字段并发布{"started":"2012-07-02 09:24:45","task":{"id":1}}具有相同结果的内容.
控制器方法是:
@BodyParser.Of(play.mvc.BodyParser.Json.class)
public static Result create(Long task_id) {
Form<Run> runForm = form(Run.class).bindFromRequest();
for (String key : runForm.data().keySet()) {
System.err.println(key + " => " + runForm.apply(key).value() + "\n");
}
if (runForm.hasErrors())
return badRequest(runForm.errorsAsJson());
Run run = runForm.get();
run.task = Task.find.byId(task_id);
run.save();
ObjectNode result = Json.newObject();
result.put("id", run.id);
return ok(result);
}
Run Code Online (Sandbox Code Playgroud)
我还可以从输出中看到正确接收的值.有谁知道如何使这项工作?
阅读处理表单提交页面的"注册自定义数据绑定"部分以及应用程序全局设置页面并与此问题进行比较后,我想出了以下解决方案:
我创建了一个带有可选格式属性的自定义注释:
package models;
import java.lang.annotation.*;
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@play.data.Form.Display(name = "format.joda.datetime", attributes = { "format" })
public @interface JodaDateTime {
String format() default "";
}
Run Code Online (Sandbox Code Playgroud)
并注册了一个自定义格式化程序onStart:
import java.text.ParseException;
import java.util.Locale;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import play.*;
import play.data.format.Formatters;
public class Global extends GlobalSettings {
@Override
public void onStart(Application app) {
Formatters.register(DateTime.class, new Formatters.AnnotationFormatter<models.JodaDateTime,DateTime>() {
@Override
public DateTime parse(models.JodaDateTime annotation, String input, Locale locale) throws ParseException {
if (input == null || input.trim().isEmpty())
return null;
if (annotation.format().isEmpty())
return new DateTime(Long.parseLong(input));
else
return DateTimeFormat.forPattern(annotation.format()).withLocale(locale).parseDateTime(input);
}
@Override
public String print(models.JodaDateTime annotation, DateTime time, Locale locale) {
if (time == null)
return null;
if (annotation.format().isEmpty())
return time.getMillis() + "";
else
return time.toString(annotation.format(), locale);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
您可以根据需要指定格式,或者默认情况下它将使用自纪元以来的毫秒数.我希望自从Joda被Play发行版收录以来会有一个更简单的方法,但这让事情变得有效.
注意:您需要重新启动Play应用,因为它似乎无法检测到Global类的更改.
| 归档时间: |
|
| 查看次数: |
1486 次 |
| 最近记录: |