【问题标题】:Format spring Errors message arguments格式化 spring 错误消息参数
【发布时间】: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 PMdt1dt2 都使用它们的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


【解决方案1】:

您可以尝试在控制器中使用 CustomDateEditor 和 WebBinding 来格式化日期。您可以尝试在控制器中添加类似的内容:

@Controller
public class MyController {
       @InitBinder
       public void customizeBinding (WebDataBinder binder) {
            SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
            binder.registerCustomEditor(Date.class, "dt1",
                 new CustomDateEditor(dateFormatter, true));
            binder.registerCustomEditor(Date.class, "dt2",
                 new CustomDateEditor(dateFormatter, true));
       }

       @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");
            }
        }

}

我使用并修改了这个例子:http://www.logicbig.com/tutorials/spring-framework/spring-web-mvc/spring-custom-property-editor/

这是内置属性编辑器的官方 Spring 文档:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/validation.html#beans-beans-conversion

希望它能够在将其转换为字符串时使用 format 方法显示您想要的格式。

否则,您可能不得不做一些非常奇怪的事情并将 DateTime 扩展为您自己的日期时间并覆盖 toString() 方法,但这似乎是一个过于暴力的解决方案。

 public class MyDateTime extends DateTime {

      @Override
      public toString() {
           return new SimpleDateFormat("yyyy-MM-dd).format(this);
      }
 }

然后

MyDateTime dt1 = createForm.getDt1();
MyDateTime dt2 = createForm.getDt2();

【讨论】:

    猜你喜欢
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2019-07-11
    • 2021-06-28
    相关资源
    最近更新 更多