解决:Failed to convert value of type 'java.lang.String' to required type 'java.util.Date';

发生这一错误的主要原因是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()));
			}
		});
	}
}

 

你可能感兴趣的:(解决:Failed to convert value of type 'java.lang.String' to required type 'java.util.Date';)