尝试使用Jackson序列化一个非常简单的对象时,我得到了一个例外 . 错误:
org.codehaus.jackson.map.JsonMappingException:没有找到类MyPackage.TestA的序列化程序,也没有发现创建BeanSerializer的属性(为了避免异常,请禁用SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))
下面是序列化的简单类和代码 .
任何人都可以告诉我为什么会收到此错误?
public class TestA {
String SomeString = "asd";
}
TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
String testAString = om.writeValueAsString(testA); // error here!
TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
14 回答
虽然我添加了getter和setter但我得到了同样的错误 . 后来我发现了一个错误,就是按照Sonar的建议,我把吸气剂和固定剂作为保护因素引起了问题 . 一旦我修复了它就像预期的那样工作 .
问题可能是因为您已将变量声明为
private
. 如果将其更改为public
,则可以 .更好的选择是使用getter和setter方法 .
这将解决问题!
对于Jackson来序列化该类,
SomeString
字段需要public
(现在它的包级别隔离)或者你需要为它定义getter和setter方法 .如果您可以编辑包含该对象的类,我通常只需添加注释
我通过hibernate代理对象进行延迟加载时遇到了类似的问题 . 通过注释具有延迟加载的私有属性的类来解决它:
SpringBoot2.0,我通过以下代码解决它:
以下是三个选项:
已被访问的数据/类需要
public
如果不是
public
,请添加 getters & setters或添加
@JsonIgnore("context")
我发现至少有三种方法可以做到这一点:
在您尝试序列化的实体上添加
public getters
;如果您不想要
public getters
,请在实体顶部添加注释 . 这会将Jackson的默认值从Visbility=DEFAULT
更改为@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
,其中接受任何访问修饰符;通过设置
objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
全局更改ObjectMapper
. 如果您不需要全局此功能,则应避免这种情况 .根据您的需求选择 .
如前所述,
ObjectMapper
实例的默认配置是仅访问属于公共字段或具有公共getter / setter的属性 . 更改类定义以使字段公开或提供公共getter / setter的替代方法是指定(对于底层VisibilityChecker
)不同的属性可见性规则 . Jackson 1.9提供了ObjectMapper.setVisibility()
方便的方法 . 对于原始问题中的示例,我可能将其配置为有关相关配置选项的更多信息和详细信息,建议您查看the JavaDocs on ObjectMapper.setVisibility() .
我的问题是 Jackson 试图序列化一个没有属性和方法的空对象 .
正如异常中所建议的,我添加了以下行以避免空bean失败:
Jackson 1.9
对于Jackson 2.X
你可以在jackson disable fail_on_empty_beans找到一个简单的例子
我的源代码中存在同样的问题 . 我刚才补充道
和
问题解决了 .
对于我控制的子类,我遇到了同样的问题,对象映射器在一个公共模块中并且无法访问 . 我通过为我的子类添加这个注释来解决它,它的对象是序列化的 .
如果您忘记将.build()方法添加到返回状态,也会抛出此错误 .
没有build()方法我得到以下错误:
对于Oracle Java应用程序,请在
ObjectMapper
实例化后添加: