2014-01-21 1 views
3

Как преобразовать строку из ввода формы (easyui-datetimebox, на случай) в свойство Календара в объекте в контроллере, автоматически закрытом весной?Spring: преобразовать строку из представления в объект календаря

Я читал http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/validation.html, но я не мог найти ничего почти прямо к делу.

JSP:

<input id="DeadLineDate" 
    class="easyui-datetimebox" 
    name="DeadLineDate" 
    value="${SessionDeadLineDate}" 
    data-options="formatter:myformatter, 
       parser:myparser 
/> 

Когда занесена, проверка Пружина выдает ошибку:

Failed to convert property value of type java.lang.String to required type java.util.Calendar for property DeadLineDate; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [java.util.Calendar] for property DeadLineDate: no matching editors or conversion strategy found. 

PS: Пружина 3

Редактировать: добавление метода контроллера для выполнения операции:

@Controller 
@RequestMapping("/project/MaintainProjectFrm") 
@SessionAttributes({"project","SessionDeadLineDate"}) 
public class MaintainProjectController { 

    /* ... many methods... */ 

    @RequestMapping(params = "update", method = RequestMethod.POST, produces={"text/plain; charset=UTF-8"}) 
    public String update(@ModelAttribute("project") Project project, 
          BindingResult result, 
            SessionStatus status, 
             ModelMap model, 
              HttpServletRequest req, 
               HttpServletResponse resp) throws IOException { 

     projectValidator.validate(project, result); 

     if (result.hasErrors()) { 
      //has errors, in this case, that one shown in text above, which is rendered again in view (JSP) 
      return "/project/MaintainProjectFrm"; 
     } else { 

      try{ 
       mpService.updateProject(project); 
      } 
      catch(Exception e){ 
       resp.setStatus(500); 
       resp.getWriter().write("Error updating project: " + e.getMessage()); 
       return "/project/MaintainProjectFrm"; 
      } 

      status.setComplete(); 

     } 
    } 

    /* ... yet other methods ... */ 
} 
+1

Можем ли мы увидеть ваш метод обработчика? –

+0

@SotiriosDelimanolis: конечно, сделано! – Alex

+0

Я использовал @RequestParam для получения DeadLineDate из представления и вручную создаю на нем объект Calendar, обновляя объект Project. Но, разумеется, это не самый лучший способ сделать это! Я хотел бы знать, может ли в каком-то манеже Spring возможность автоматически привязать Календарь к этому свойству. – Alex

ответ

7

Я предполагаю, что ваш класс Project имеет поле DeadLineDate (поля должны начинаться с символов нижнего регистра).

аннотацию с @DateTimeFormat как так

@DateTimeFormat(pattern = "yyyy/MM/dd") // or whatever pattern you want 
private Calendar DeadLineDate; 

Ваш клиент будет необходимо отправить соответствующий шаблон.

+0

Отлично !!! Я ожидал большего от того, как писал, как писал @gregor, но определенно это был самый простой способ. Замечательно, что Spring обладает такой гибкостью. И да, я, безусловно, использую java-шаблон. Моя фамилия была «некапитализирована» при переводе имен материалов с португальского. Большое спасибо! – Alex

+0

Отличный aproach! – viniciusalvess

4

У вас есть две возможности для достижения этой цели: Вы можете использовать PropertyEditor

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.registerCustomEditor(Calendar.class, new PropertyEditorSupport() { 
     @Override 
     public void setAsText(String text) throws IllegalArgumentException { 
      setValue(parseDate()); 
     } 

     private Calendar parseDate() { 
      try { 
       Calendar cal = Calendar.getInstance(); 
       SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); 
       cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011")); 
       return cal; 
      } catch (ParseException e) { 
       return null; 
      } 
     } 
    }); 
} 

Для документации see thisand this.

Или вы можете воспользоваться услугой преобразования пружины. Для этого см .: "Spring 3 Type Conversion".

+0

спасибо за ваш ответ (я проголосовал). Но я скорее использовал подход Sotirios Delimanolis, который был самым простым решением для моего дела. С уважением! – Alex

+0

@Alex: Используется ли принятое решение для весны 3.1? Для моего случая этот ответ спас меня! Спасибо, gregor. +1 – sarwar026

+0

@ sarwar026, я фактически обновляюсь до весны 3.6, и я еще не смог его протестировать. – Alex

-1

попробовать это как Sotirios Delimanolis сказал ..

@DateTimeFormat(pattern = "yyyy/MM/dd") // or whatever pattern you want 
private Calendar DeadLineDate; 

и, наконец, добавьте в pom.xml:

<dependency> 
    <groupId>joda-time</groupId> 
    <artifactId>joda-time</artifactId> 
    <version>2.3</version> 
</dependency> 
Смежные вопросы