JSON parse error: default constructor not found. class java.time.YearMonth; nested exception is com.alibaba.fastjson.JSONException: default constructor not found. class java.time.YearMonth

java8新出的YearMonth可以方便的用来表示某个月。我的项目中使用springmvc来接收YearMonth类型的数据时发现 x-www-from-urlencoded 格式的数据可以使用"2018-12"的类型接收,但是在post请求中 接收application/json的数据时出现以下错误

2020-02-18 11:18:25.284 WARN 16212 --- [nio-8090-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: default constructor not found. class java.time.YearMonth; nested exception is com.alibaba.fastjson.JSONException: default constructor not found. class java.time.YearMonth;

通过异常应该是YearMonth没有公有构造函数 ,fastjson不支持解析YearMonth;案例使用fastjson作为了springmvc的序列化工具,类似如下的配置

@Configuration
public class MyConverter implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
        converters.add(0,fastJsonHttpMessageConverter);
    }
}

通过查看MonthYear确实发现其私有化了构造函数,只留了两静态方法

    private YearMonth(int year, int month) {
        this.year = year;
        this.month = month;
    }
    public static YearMonth of(int year, int month) {
        YEAR.checkValidValue(year);
        MONTH_OF_YEAR.checkValidValue(month);
        return new YearMonth(year, month);
    }
    private YearMonth with(int newYear, int newMonth) {
        if (year == newYear && month == newMonth) {
            return this;
        }
        return new YearMonth(newYear, newMonth);
    }

不过get请求时能获取得到,说明jackson应该是对其有专门的处理工具的。将springmvc的序列化工具修改为默认的jackson,发现能 将application/json请求中 “2018-12”格式的数据  顺利的反序列化YearMonth类型。然后通过查找发现jackson确实带有YearMonth的序列化反序列化工具

(看来springmvc将jackson作为默认序列化工具还是有原因的。。)

所以解决方法看来也找到了。就是使用默认的jackson作为序列化工具就可以解决了。

当然了,如果项目不好更改,想使用fastjson也有解决办法。fastjson允许为字段定制反序列化工具,然后对应字段标明使用指定的反序列化类即可  (序列化原理类似)

public class YearMonthDeserializer implements ObjectDeserializer {
    @Override
    public YearMonth deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
        return YearMonth.parse(parser.getLexer().stringVal());
    }

    @Override
    public int getFastMatchToken() {
        return 0;
    }
}
public class AddVO {

    @JSONField(deserializeUsing = YearMonthDeserializer.class)
    private YearMonth yearMonth;

    public YearMonth getYearMonth() {
        return yearMonth;
    }

    public void setYearMonth(YearMonth yearMonth) {
        this.yearMonth = yearMonth;
    }
}

原文地址:https://www.cnblogs.com/hetutu-5238/p/12325457.html

时间: 2024-09-28 16:31:28

JSON parse error: default constructor not found. class java.time.YearMonth; nested exception is com.alibaba.fastjson.JSONException: default constructor not found. class java.time.YearMonth的相关文章

Spring Mvc使用Jackson进行json转对象时,遇到的字符串转日期的异常处理(JSON parse error: Can not deserialize value of type java.util.Date from String)

1.问题排查 - 项目配置 springboot 2.1 maven配置jackson - 出现的场景: 服务端通过springmvc写了一个对外的接口,查询数据中的表,表中有一个字段属性是时间戳,返回一个json字符串,其中该json带有日期,格式为yyyy-MM-dd HH:mm:ss 客户端调用该http接口,指定返回值为一个Vo,Vo中日期的字段为Date类型 客户端调用该接口后抛异常了.报错信息如下: feign.codec.DecodeException: JSON parse er

JSON parse error: Cannot deserialize instance of `int` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc

代码程序: @PostMapping("selectById") @ResponseBody public Result selectById(@RequestBody int id) { Result result =new Result(); List<User> list = userService.selectById(id); if(list.size()==1){ result.setCode("000"); result.setMsg(&q

JSON parse error: Unexpected character (&#39;}&#39; (code 125)): was expecting double-quote to start field name;

JSON parse error: Unexpected character ('}' (code 125)): was expecting double-quote to start field name; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('}' (code 125)): was expecting double-quote to start fie

Requests库发送post请求,传入接口参数后报JSON parse error

报错信息: {"timestamp":"2020-01-08T14:42:40.894+0000","status":400,"error":"Bad Request","message":"JSON parse error: Cannot deserialize instance of `java.util.ArrayList` out of VALUE_STRING tok

JSON parse error: Cannot deserialize value of type `java.util.Date` from String

DateTimePicker + @DateTimeFormat("yyyy-MM-dd HH:mm:ss")日期格式转换异常 最近在做的一个项目使用的日期格式是yyyy-MM-dd HH:mm:ss格式的,在后端Java与MySQL这边的转换中一开始格式没有统一间歇性的就会报异常,后面采用了一个@DateTimeFormat("yyyy-MM-dd HH:mm:ss")注解标注在属性上规范了 Date 类型属性的格式(埋坑~) 在前端这边使用的是ElementUI

JSON Parse error: Unexpected identifier &quot;object&quot;;stringToAnyType报错 uni-app

只限于uni 的局限问题,博主的报错是因为初始化某些关键数据在uni的  onLoad生命周期  和  onReady生命周期里面初始化,导致数据加载时出现个别报错的BUG JSON Parse error: Unexpected identifier "object";stringToAnyType 换到 vue的created生命周期里面初始化就解决了 原文地址:https://www.cnblogs.com/swordLaughsHeaven/p/12293016.html

FastJson处理数据出现错误 com.alibaba.fastjson.JSONException: syntax error, expect {, actual error, pos 1

用ajax发送JSON数据,其中数据类型为List,出现com.alibaba.fastjson.JSONException: syntax error, expect {, actual error, pos 1这种类型的错误 一般是数据格式问题 首先我们必须清楚JSON的数据格式 JSON中,对象用{  }包围,映射用":"表示,集合或数组用[  ]包围 比如一个Java类的JSON格式为 { 名称1:值1, 名称2:值2 } 一个List的JSON格式为 [ {名称1:值,名称2

当使用servlet输出json时,浏览器端jquery的ajax遇到parse error的问题

在使用jquery的ajax进行请求发送并由服务端的servlet返回json格式的数据内容时,假设输出内容没有正确设置,会遇到client浏览器报告parse error的问题.这个问题的解决仅仅须要注意下面两点: 第一.在servlet输出json格式的内容是请在response.getWriter()之前运行response.setContentType("application/json"); 第二,输出的json格式字符串一定是使用双引號包括的( 比方:{"user

JSON.parse与eval的区别

JSON.parse与eval和能将一个字符串解析成一个JSON对象,但还是有挺大区别. 测试代码 var A = "{ a: 1 , b : 'hello' }"; var B = "{ 'a': 1 , 'b' : 'hello' }"; var C = "{'a':1,'b':'hello'}"; var D = '{"a":1,"b":"hello"}'; var E = '{