SpringMVC报错 404:Bad request
出现这个错误一般是因为前台传入的值与后台实体类的值不匹配,比如说我的emp实体就是因为 date类型,Spring 不能自动封装出现这个问题;
当然,解决问题最快速的方法是不把属性是date的值直接封装,在后台另外获取后装换,再放入实体,但是这样比较麻烦,所以,可以直接定义全局的Date转换器;
下面是配置时间转换器的方法:
package com.base.utils;
/**
* 创建时间:
* 项目名称:tra
* @author hc
* @version 1.0
* 文件名称:DateConverter.java
* 类说明: 自定义日期转换器
*/
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.core.convert.converter.Converter;
public class DateConverter implements Converter<String, Date> {
private static final List<String> formarts = new ArrayList<String>(4);
static{
formarts.add("yyyy-MM");
formarts.add("yyyy-MM-dd");
formarts.add("yyyy-MM-dd hh:mm");
formarts.add("yyyy-MM-dd hh:mm:ss");
}
public Date convert(String source) {
String value = source.trim();
if ("".equals(value)) {
return null;
}
if(source.matches("^\\d{4}-\\d{1,2}$")){
return parseDate(source, formarts.get(0));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")){
return parseDate(source, formarts.get(1));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")){
return parseDate(source, formarts.get(2));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")){
return parseDate(source, formarts.get(3));
}else {
throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
}
}
/**
* 功能描述:格式化日期
*
* @param dateStr
* String 字符型日期
* @param format
* String 格式
* @return Date 日期
*/
public Date parseDate(String dateStr, String format) {
Date date=null;
try {
DateFormat dateFormat = new SimpleDateFormat(format);
date = (Date) dateFormat.parse(dateStr);
} catch (Exception e) {
}
return date;
}
public static void main(String[] args) {
System.err.println(new DateConverter().convert("2014-04"));
}
}
配置一下spring mvc 配置文件
<!-- 自定义时间转换器 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.hansuo.base.utils.DateConverter"></bean> </list> </property> </bean> <!-- 注册转换器 --> <mvc:annotation-driven conversion-service="conversionService" /><!-- 自定义时间转换器 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="com.hansuo.base.utils.DateConverter"></bean> </list> </property> </bean> <!-- 注册转换器 --> <mvc:annotation-driven conversion-service="conversionService" />
网上我看了一些有关问题,看网友们还有一些其他原因导致这个错误的,特总结归纳了一下方便网友们参考:
(1)log4j的配置文件里错误将部分log打为Info级别所致
(2)传参数的时候,参数名使用了关键字“name”(我试了试,我的没报错正常)
(3)本来要返回json的却忘了加@RequestBody
(4)ajax请求的连接后边忘了加参数
(5)前台传参时参数的顺序与后台实体类的各个属性的顺序不一致(我试了试,我的顺序改变无影响)
(6)如果是传了非实体bean属性的参数过来也会发生这种情况