【发布时间】:2016-07-08 06:21:25
【问题描述】:
我有一个 Spring Boot Web 应用程序,但我拒绝控制器中的值,如下所示:
@RequestMapping(value = "/create", method = RequestMethod.POST)
public String createSubmit(@ModelAttribute("createForm") CreateForm createForm, BindingResult result, SessionStatus status) {
DateTime dt1 = createForm.getDt1();
DateTime dt2 = createForm.getDt2();
if (!dt1.isBefore(dt2)){
result.rejectValue("fieldId", "validation.isbefore", new Object[]{dt1, dt2}, "first date must be before second");
}
}
因此,如果日期 dt1 不在 dt2 之前,则该值将被拒绝。现在,我有相当标准的ResourceBundleMessageSource,在messages_en.properties 中有这个条目:
validation.isbefore = Start date {0} must be before end date {1}
当验证错误发生时,我收到一条消息Start date 3/21/16 5:01 PM must be before end date 3/20/16 5:01 PM(dt1 和dt2 都使用它们的toString() 来格式化消息)。
现在,java.text.MessageFormat 确实支持某些格式,即{0,date,short}。但这仅适用于 java.util.Date,不适用于 Joda Time(或任何其他自定义类)。
有没有办法自定义错误消息参数的格式?我不想在验证时这样做(在最终代码中,验证器本身与控制器分离,没有有关所选语言的信息,因此它不知道要使用哪种日期格式)。
【问题讨论】:
-
真的,您不应该在服务器上处理表示逻辑。
-
@EngineerDollery 服务器负责生成 HTML(它是 Spring MVC/Thymeleaf),所以我必须处理服务器上的演示/本地化。
-
HTML 用于结构,css(有时是 javascript)负责呈现。 Java 负责验证、业务规则和 CRUD。您需要 javascript 来格式化它,但如果您将日期包装在一个易于识别的 div 中,这应该很容易。然后 gui 人员可以处理 L&F 问题,让您继续编写服务器代码。 :)
-
无论如何,即使这样,您也必须以某种方式将数据从 java 传递到 HTML(以便您可以使用 CSS/JS 对其进行格式化)。你会怎么做——传递 DateTime.toString 并在 JS 中解析它?这没有意义..
-
那么你再一次将 java 与 HTML 纠缠在一起。在我看来,本地化文件/模块确实不应该处理 divs/classes/etc。即使这样,您也必须使用 DateTime 的 toString,例如。您必须以某种方式将其解析回javascript。它可能适用于 DateTime,但肯定适用于自定义类。
标签: java spring validation spring-mvc