json数据转换异常之 java.lang.reflect.InvocationTargetException
又是好久没有动静了,一直忙着项目的研发,有时候遇到了烦人的bug和异常时也没有时间去好好研究分析原因。现在有时间就赶紧把自己在项目中遇到的问题和大家分享下,可能这其中有很多对于大神来说都不够成bug范围内,但是对于本人来说,新手上路,还是需要总结与记录,加强一下。
好了,还是按照我一贯的习惯,先把问题抛出来:
项目想做打印页面,需要数据。我的设想是后台取到前端页面值再传到前端,前端取值后拼接到路径上,最后打印页面在从中取数据显示打印。(当然这是本人个人想法方案,可能有更好的方法,并没有求证于大神!)前期使用确实成功了,因为这种操作其实没有通过数据库取值,只需要后台一个接口的“中间商”就搞定了。(当然可能有人会说直接在当前页面打印不行吗?这么折腾干嘛?我只想说,我也想这样,但是打印页面风格差异太大,只能另起炉灶了!)
在我加入数据库取值后,我要把后台取出的List对象转换为Json识别的数据,而我用的转换类是net.sf.json.JSONObject
突然就不行,报了个异常java.lang.reflect.InvocationTargetException,控制台只有这么一句话,什么都没有了,也没有其他的错误日志了。这就让人很头疼了。先是百度了一下遇见的这个问题,也总结了一下网上的经验:
1、反射的参数不对,内部方法错误,这个原因就是可能自己的方法上没有对应上,好好去检查下,是不是有空指针等原因
2、也有可能是项目的环境配置问题。(当然,项目都已经上线运行了,这个可以排除了)
3、包的问题
4、jdk版本的问题
其实说了这么多可能性,并不是说我想到的,只是为了帮助大家多一些思路,因为我这基本不会是上述所说的问题。
而我遇到的问题其实就是json转换的时候类型匹配不上的问题了。因为对象内都有除了基本类型的数据,比如Date类型的,那么在对象转json时,JSONObject就无法及时的将Date类型转为Json所支持的类型了。其实网上还有说是数据库里的Date包和后台的date包类型不一致没有延时的问题。
说了半天,问题排除了,也定位到了原因那么就要解决一下了。在这里就要感谢下编写这篇博客的博主了https://blog.csdn.net/ye1992/article/details/17436765#reply ,我也是在试用了这个博客博主的方法后才有了思路。
其实在对象转Json中,Java给了一个配置类JsonConfig
- 解决方案:使用jsonConfig即可
- JsonConfig jsonConfig = new JsonConfig();
- jsonConfig.registerJsonValueProcessor(java.util.Date.class, new DateJsonValueProcessor("yyyy-MM-dd HH:mm:ss"));
Example:
@SuppressWarnings("unchecked")
public static void testMap() {
Map map = new HashMap();
map.put("name", "json");
map.put("class", "ddd");
JsonConfig config = new JsonConfig();
config.setIgnoreDefaultExcludes(true); //默认为false,即过滤默认的key
3、setCycleDetectionStrategy 防止自包含
- public static void testUser() {
- User object = new User();
- object.setMemberId("yajuntest");
- object.setSex("male");
- JsonConfig jsonConfig = new JsonConfig();
- jsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
- JSONObject json = JSONObject.fromObject(object, jsonConfig);
- System.out.println(json);
- }
- public static void main(String[] args) {
- JsonTest.testUser();
- }
- String str = "{'string':'JSON', 'integer': 1, 'double': 2.0, 'boolean': true}";
- JsonConfig jsonConfig = new JsonConfig();
- jsonConfig.setExcludes(new String[] { "double", "boolean" });
- JSONObject jsonObject = (JSONObject) JSONSerializer.toJSON(str, jsonConfig);
- System.out.println(jsonObject.getString("string"));
- System.out.println(jsonObject.getInt("integer"));
- System.out.println(jsonObject.has("double"));
- System.out.println(jsonObject.has("boolean"));
- package com.tem.json.helper;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import net.sf.json.JsonConfig;
- import net.sf.json.processors.JsonValueProcessor;
- /**
- * 将Bean中的Timestamp、Date转换为json中的日期字符串
- * @author
- *
- */
- public class DateJsonValueProcessor implements JsonValueProcessor {
- public static final String Default_DATE_PATTERN ="yyyy-MM-dd";
- private DateFormat dateFormat ;
- public DateJsonValueProcessor(String datePattern){
- try{
- dateFormat = new SimpleDateFormat(datePattern);}
- catch(Exception e ){
- dateFormat = new SimpleDateFormat(Default_DATE_PATTERN);
- }
- }
- public Object processArrayValue(Object value, JsonConfig jsonConfig) {
- return process(value);
- }
- public Object processObjectValue(String key, Object value,JsonConfig jsonConfig) {
- return process(value);
- }
- private Object process(Object value){
- return dateFormat.format((Date)value);
- }
- }