发生这一错误的主要原因是Controller类中需要接收的是Date类型,但是在页面端传过来的是String类型,最终导致了这个错误。
这里可以在数据到达controller 前把string数据转成 date 类型
@Controller
public class UserController{
@RequestMapping(value="/login.do")
public String login(String username,Date birthday){
System.out.println("________");
return "";
}
//只需要加上下面这段即可,注意不能忘记注解
@InitBinder
public void initBinder(WebDataBinder binder, WebRequest request) {
//转换日期
DateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));// CustomDateEditor为自定义日期编辑器
}
}
可以把对数据格式的转化抽取到一个父类中
package com.cfcc.tsms.base.controller;
import com.cfcc.tsms.auth.persistence.dto.TsOrganization;
import com.cfcc.tsms.auth.persistence.dto.TsUser;
import com.cfcc.tsms.base.shiro.ShiroSessionUtils;
import com.cfcc.tsms.common.utils.DateUtils;
import org.apache.commons.lang3.StringEscapeUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import java.beans.PropertyEditorSupport;
import java.sql.Timestamp;
import java.util.Date;
/**
* gezongyang
*/
public abstract class BaseController {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
@InitBinder
public void initBinder(WebDataBinder binder) {
// String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击
binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) {
setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
}
@Override
public String getAsText() {
Object value = getValue();
return value != null ? value.toString() : "";
}
});
// Date 类型转换
binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) {
setValue(DateUtils.parseDate(text));
}
});
// Timestamp 类型转换
binder.registerCustomEditor(Timestamp.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) {
Date date = DateUtils.parseDate(text);
setValue(date == null ? null : new Timestamp(date.getTime()));
}
});
}
}