因为Springmvc 没法自动把日期类型传入controller层方法的参数中所以需要自定义类型转换器
如果是转换成Date类型 那么就直接这样写就可以
*
* 把字符串类型的日期转换为Date类型
*
* */
public class DateConverter implements Converter<String, Date> {
//当接收到字符串时,将字符串转换为Date
@Override
public Date convert(String s) {
Date d=null;
System.out.println(s);
try {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
d=sdf.parse(s);
}
catch (Exception e){
try {
SimpleDateFormat sdf=new SimpleDateFormat("yyyy.MM-.d");
d=sdf.parse(s);
} catch (ParseException e1) {
e1.printStackTrace();
}
}
System.out.println(d);
return d;
}
}
@RequestMapping("/register")
public String register(String name, int age, double price, Date date){
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("存储金额:"+price);
System.out.println("生日:"+date);
return "redirect:index.jsp";
}
在Springmvc配置文件中配置一下:
<!--把转换器配置为bean标签-->
<bean id="dateConverter" class="cn.edu.nyist.converter.DateConverter"></bean>
<!-- 注册这个转换器-->
<!-- cn.edu.nyist.converter.DateConverter.springframework.format.support.FormattingConversionServiceFactoryBean"这个类管理-->
<!-- 注册这个转换器,让Springmvc知道这个转换器-->
<bean id="fcsfb" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="dateConverter"></ref>
</set>
</property>
</bean>
<!-- 开启注解的标签里面做配置-->
<mvc:annotation-driven conversion-service="fcsfb"/>
这样没问题的。
但是java原生的时间API 并不好用,且java8 中提供了新的时间API
所以我们应该使用转换器 返回LocalTime 类型的对象
现在修改或者重新创建一个转换器,让它转换成LocalDate类型。
public class DateConverter2 implements Converter<String, LocalDate> {
//当接收到字符串时,将字符串转换为Date
@Override
public LocalDate convert(String s) {
LocalDate d=null;
System.out.println(s);
try {
DateTimeFormatter formatter= DateTimeFormatter.ofPattern("yyyy-MM-dd");
d=LocalDate.parse(s,formatter);
}catch (Exception e){
DateTimeFormatter formatter2=DateTimeFormatter.ofPattern("yyyy.MM.dd");
d=LocalDate.parse(s,formatter2);
}
System.out.println(d);
return d;
}
}
Controller层中 的方法
@RequestMapping("/register2")
public String register2(String name, int age, double price, LocalDate date){
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
System.out.println("存储金额:"+price);
System.out.println("生日:"+date);
return "redirect:index.jsp";
}
在Springmvc配置文件中 的配置 我就不写了,和上面的一样
当我以为这样就可以的时候,执行下
报错…
我想了一下 意思是参数 LocalDate date 没有创建
蛤…我不是创建了 转换器了吗 不应该是返回了一个LocalDate对象吗
难道是因为我的转换器写的有问题?
测试下发现 转换器根本都没进去。。。。
后来看网上说的
在LocalDate date 参数前 加 @RequestParam(required=false)可以
在将信将疑中测试了 发现可以
我把LocateDate date 参数 封装进了类中作为属性 发现也可以。
后来我把@RequestParam required属性的值改为false 发现也可以了…
我把required属性去掉行不行呢 我去… 也可以
那再把@RequestParm 去掉呢 好吧 又是500
其实我没想明白这个问题根源在哪…
但是这样问题确实是解决了…
希望有大佬能告诉我问题的所在,感谢
2019/10/23更新--------------------
如果你的Controller中的LocalDate类型的参数啥注解(RequestParam、PathVariable等)都没加,也是会出错的,因为默认情况下,解析这种参数使用ModelAttributeMethodProcessor进行处理,而这个处理器要通过反射实例化一个对象出来,然后再对对象中的各个参数进行convert,但是LocalDate类的构造方法是私有的,无法反射实例化因此会报错!!!
详情请看这篇博文:https://blog.csdn.net/tyjlearning/article/details/96480272