2016-03-21 3 views
4

У меня есть веб-приложение Spring загрузки и я отвергаю значение в контроллере, как это:Формат пружинные Ошибки аргументы сообщение

@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 (или любых других пользовательских классов, если на то пошло).

Есть ли способ настроить способ форматирования сообщений об ошибках? Я не хочу делать это во время проверки (в конечном коде сам валидатор отделен от контроллера, не имеет информации о выбранном языке, поэтому он не знает, какой формат даты использовать).

+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/

Вот официальная Спринг документация для встроенных редакторов недвижимости: http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/validation.html#beans-beans-conversion

Будем надеяться то он сможет отобразить формат, который вы хотите, используя метод format при преобразовании его в String.

В противном случае вам может потребоваться сделать что-то действительно странное и расширить 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(); 
Смежные вопросы