2016-03-21 54 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();