com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class ...

在项目代码调测阶段,整了半个下午,一致报JsonMappingException异常。灰常郁闷~
刚开始是我引用的jar报编译版本是jar1.7的,而我的项目编译的jdk是1.6,所以报版本不支持,这个我就忍了。关键是处理掉之后就开始报上面这个错误。。。就自己写了个测试程序,看下问题出在哪里了:

 package com.test;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {
    public static void main(String[] args) throws JsonProcessingException {
        Apple a = new Apple(1);
        ObjectMapper om = new ObjectMapper();
        String s = om.writeValueAsString(a);
        System.out.println(s);
    }
}
class Apple{

    public Apple(int size) {
        super();
        this.size = size;
    }

    private int size;
}

然后就抛异常了:

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class com.test.Apple and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:284)
    at com.fasterxml.jackson.databind.SerializerProvider.mappingException(SerializerProvider.java:1110)
    at com.fasterxml.jackson.databind.SerializerProvider.reportMappingProblem(SerializerProvider.java:1135)
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:69)
    at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:32)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:292)
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:3681)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3057)
    at com.test.Test.main(Test.java:10)

就上网查询了一下,原来ObjectMapper默认配置是:只能对那些有访问权限的属性进行转换!分为两类:1.public field;
2.具有getter/setter方法的private属性;
所以当我把Apple对象的getter/setter方法补充完整后就正常了!

其实还有一种解决方案:就是更改ObjectMapper的配置—-

om.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);

这样就可以把private属性也进行字符串转换了!

猜你喜欢

转载自blog.csdn.net/ls0111/article/details/77507340
今日推荐