Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Conversion data type in spring mvc

I have an problem in my Spring MVC.

@RequestMapping(value = "/novo", method = RequestMethod.GET)
public ModelAndView novoTimeSheet() {
    return new ModelAndView("timesheetcrud/novo", "timesheet", new TimeSheet());
}

My TimeSheet class has:

@NotNull(message = "timesheet.cadastro.horainicio.obrigatorio")
@Temporal(TemporalType.TIME)
@Column(name = "INICIO", nullable = false)
private Date horaInicio;

@NotNull(message = "timesheet.cadastro.horafim.obrigatorio")
@Temporal(TemporalType.TIME)
@Column(name = "FIM", nullable = false)
private Date horaFim;

My addTimeSheet:

@RequestMapping(value = "/addtimesheet", method = RequestMethod.POST)
public String addTimeSheet(@ModelAttribute("timesheet")TimeSheet timeSheet,
                         ModelMap model) {

In browser when I put something not equal date, I have this error:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 2 errors
Field error in object 'timesheet' on field 'horaFim': rejected value [lala]; 
codes [typeMismatch.timesheet.horaFim,typeMismatch.horaFim,typeMismatch.java.util.Date,typeMismatch]; 
arguments [
  org.springframework.context.support.DefaultMessageSourceResolvable: codes [timesheet.horaFim,horaFim]; 
  arguments []; 
  default message [horaFim]
]; 
default message [
  Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'horaFim'; 
  nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.validation.constraints.NotNull @javax.persistence.Temporal @javax.persistence.Column java.util.Date for value 'lala'; 
  nested exception is java.lang.IllegalArgumentException
]
Field error in object 'timesheet' on field 'horaInicio': rejected value [teste]; 
codes [typeMismatch.timesheet.horaInicio,typeMismatch.horaInicio,typeMismatch.java.util.Date,typeMismatch]; 
arguments [
  org.springframework.context.support.DefaultMessageSourceResolvable: codes [timesheet.horaInicio,horaInicio]; 
  arguments []; 
  default message [horaInicio]
]; 
default message [
  Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'horaInicio'; 
  nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.validation.constraints.NotNull @javax.persistence.Temporal @javax.persistence.Column java.util.Date for value 'teste'; 
  nested exception is java.lang.IllegalArgumentException
]

How can I do it? Expect Date but I put String in the field, I'd like to validate before my controller.

like image 969
user812612 Avatar asked Dec 12 '22 14:12

user812612


2 Answers

you need to add some binding to your Controller, something like :

@InitBinder
protected void initBinder(WebDataBinder binder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
like image 96
Daniel Robertus Avatar answered Jan 24 '23 19:01

Daniel Robertus


Try this:

@RequestMapping(value = "/addtimesheet", method = RequestMethod.POST)
public String addTimeSheet(@ModelAttribute("timesheet") TimeSheet timeSheet,
                           BindingResult bindingResult,
                           ModelMap model) {
  if (bindingResult.hasErrors()) {
    // validation error (binding error) handling code goes here.
  }
}

Make sure bindingResult parameter is placed on the right after the timeSheet parameter.

http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.htm

Handler methods which are annotated with this annotation are allowed to 
have very flexible signatures. They may have arguments of the following types, 
in arbitrary order (except for validation results, which need to follow right 
after the corresponding command object, if desired)
like image 24
Shinichi Kai Avatar answered Jan 24 '23 19:01

Shinichi Kai