解决 Springmvc自定义 LocalDate类型的转换器时 出现[java.time.LocalDate]: No default constructor found;

因为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

发布了26 篇原创文章 · 获赞 10 · 访问量 6489

猜你喜欢

转载自blog.csdn.net/qq_40806970/article/details/102510631
今日推荐