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) {
JSONLexer lexer = parser.getLexer();
String s = lexer.stringVal();
lexer.nextToken(16);
return YearMonth.parse(s);
} @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;
}
}

当然也可以全局处理,在我们配置fastjson作为httpMessageConverter的地方代码改为如下即可

@Configuration
public class MyConverter implements WebMvcConfigurer { @Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = fastJsonHttpMessageConverter.getFastJsonConfig();
fastJsonConfig.getParserConfig().putDeserializer( YearMonth.class,new YearMonthDeserializer());
converters.add(0,fastJsonHttpMessageConverter); }
}

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的更多相关文章

  1. com.alibaba.fastjson.JSONException: default constructor not found. class ……

    1.json工具类 package com.hyzn.fw.util; import java.util.List; import java.util.Map; import com.alibaba. ...

  2. JSON parse error: syntax error, expect {, actual error, pos 0, fastjson-version 1.2.58; nested exception is com.alibaba.fastjson.JSONExcetion: syntax error, except {, actual error, pos ...

    这个报错信息告诉你,你提交的参数需要是json类型.所以,POST请求携带的数据需要序列化一下json.dumps(data).

  3. JSON parse error: No suitable constructor found for type

    错误信息: 2019-02-19 09:17:58,678 [http-nio-8080-exec-1] WARN org.springframework.web.servlet.mvc.suppor ...

  4. 【开发遇到的问题】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写了一个对外的接口,查询数据中的表,表中有一个字段属性是时间戳,返 ...

  5. 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 i ...

  6. JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from String

    在使用Postman测试Spring Boot项目接口时,接口返回JSON parse error: Cannot deserialize value of type `java.time.Local ...

  7. JSON parse error: Can not deserialize instance of java.lang.String out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of j

    异常信息如下: JSON parse error: Can not deserialize instance of java.lang.String out of START_OBJECT token ...

  8. java开发客户端发送请求到服务器端出现这样:JSON parse error: Unexpected character ('}' (code 125)): was expecting

    org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected cha ...

  9. [待解决]报错:JSON parse error: Unexpected character

    {"code":"9999","message":"JSON parse error: Unexpected character ...

随机推荐

  1. Go_go build 和 go install

    1.作用 go build:用于测试编译包,在项目目录下生成可执行文件(有main包). go install:主要用来生成库和工具.一是编译包文件(无main包),将编译后的包文件放到 pkg 目录 ...

  2. 后台异常 - org.apache.jasper.JasperException

    问题描述 org.apache.jasper.JasperException: Unable to compile class for JSP 问题原因 tomcat6不支持jdk1.8版本

  3. 删除空目录命令 - rmdir

    (1) 命令名称:rmdir (2) 英文原意:remove empty directories (3) 命令所在路径:/bin/rmdir (4) 执行权限:所有用户 (5) 功能描述:删除空目录( ...

  4. PHP multipart/form-data 远程DOS漏洞

    import sys import urllib,urllib2 import datetime from optparse import OptionParser def http_proxy(pr ...

  5. python3练习100题——027

    又是一道迭代的题,没做好. 看了答案才试着写出来. 我一定要加油啊,为了尽快摆脱现在讨厌的生活! 原题链接:http://www.runoob.com/python/python-exercise-e ...

  6. python面试的100题(4)

    4.打乱一个排好序的list对象alist? import random alist = [1,2,3,4,5] random.shuffle(alist) print(alist) 结果为:[2, ...

  7. CentOS之service iptables stop 显示not loaded

    停止firewalld服务停止防火墙,并禁用这个服务 sudo systemctl stop firewalld.servicesudo systemctl disable firewalld.ser ...

  8. java i++与++i的区别

    i++是先赋值,然后再自+1:++i是先自+1,后赋值. 用代码表示就是: 若 a = i++; 则等价于 a=i;i=i+1; 而 a = ++i; 则等价于 i=i+1;a=i; 例子: int ...

  9. win10无法运行Vmware,怎么办

    在win10上安装了Vmware12.15都无法运行,怎么办,找了一晚上 1.点击“检查更新”或去官网下载最新版本 Vmware15.5.0,或者百度云下载 链接:https://pan.baidu. ...

  10. Java下载文件时文件名中的中文变成下划线,其他正常

    将 utf-8 转换成 ISO8859-1 编码 response.addHeader("Content-Disposition", "attachment;filena ...