2016-03-21 57 views
4

我有一个春天启动的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"); 
    } 
} 

所以,如果日期dt1dt2之前,该值将被拒绝。现在,我有这个入口非常标准的ResourceBundleMessageSourcemessages_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(包括dt1dt2使用他们toString()格式化消息)。

现在,java.text.MessageFormat确实支持某些格式,即{0,date,short}。但是,只适用于java.util.Date,而不是乔达时间(或任何其他自定义类)。

有没有办法自定义错误消息参数如何格式化?我不想在验证时进行验证(在最终代码中,验证器本身与控制器分离,没有关于所选语言的信息,因此它不知道使用何种日期格式)。

+0

真的,你不应该处理在服务器上呈现逻辑。 –

+0

@EngineerDollery那么服务器负责生成HTML(它是Spring MVC/Thymeleaf),所以我必须处理服务器上的表示/本地化。 –

+0

HTML是用于结构,css(有时是javascript)负责演示。 Java负责验证,业务规则和CRUD。你需要javascript来设置它的格式,但如果你把日期包裹在一个容易识别的div中,应该很容易。然后,gui人可以处理L&F问题,让您继续编写服务器代码。 :) –

回答

0

您可以尝试使用控制器中的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();