Crazy Yoghurt
Crazy Yoghurt

Reputation: 2405

Format of DateTime field not recognized by Spring

I am developing web application using Spring 3.2.4. I have some forms with fields containing date and time. Piece of my jsp:

<form:form method="post" action="/add" modelAttribute="licence">
    ...
    <form:input type="datetime" path="beginDate"/>
    <form:input type="datetime" path="endDate"/>
    <form:input path="quantityLimit"/>
    ...
</form:form>

Normal form, nothing fancy. I am using datepicker, which gives me date in format yyyy-MM-dd HH:mm, so I've added this to my controller:

@InitBinder
public void initBinder(WebDataBinder webDataBinder) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
    dateFormat.setLenient(true);
    webDataBinder.registerCustomEditor(DateTime.class, new CustomDateEditor(dateFormat, true));
}

Also, I have added <mvc:annotation-driven/> to my servlet configuration xml, as stated on some blogs.

There's target controller:

@RequestMapping(value = "/{softwareId}/licence/add", method = RequestMethod.POST)
public String addLicence(@PathVariable("softwareId") Long softwareId, Licence licence, Model model) {
    Software software = softwareRepository.findOne(softwareId);
    licence.setSoftware(software);
    licenceRepository.save(licence);
    return ADMIN_PATH + "softwareEdit";
}

And software class looks like this:

@Entity
@Table(name = "licences")
public class Licence {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(name = "begin_date")
private DateTime beginDate;

@Column(name = "end_date")
private DateTime endDate;

@Column(name = "quantity_limit")
private Long quantityLimit;

@ManyToOne
private Software software;

//getters, setters, etc.
}

The problem is: when I submit my form with dateTime field empty it works perfectly, but when I have anything in date field (no matter if it's properly formatted or not) I get HTTP Error 400: Bad Request. No exceptions in console, only bad request, but I am pretty sure it has something to do with date parsing.

Is there a well described method of dealing with date and time fields in forms in Spring applications?

Upvotes: 7

Views: 9783

Answers (1)

Sotirios Delimanolis
Sotirios Delimanolis

Reputation: 280178

Make your life simple and use @DateTimeFormat, getting rid of your WebDataBinder configuration. It seems CustomDateEditor only works with java.util.Date and Spring has no other (default/not-specified) mechanism to convert from a String to a DateTime.

@DateTimeFormat is such a mechanism.

@Column(name = "begin_date")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
private DateTime beginDate;

Upvotes: 8

Related Questions