Jackson - JsonMappingException(没有为类找到序列化器)
最后修改:2020年2月12日
1.概述
在此快速教程中,我们将分析没有吸气器的实体的编组杰克逊的解决方案JsonMappingException异常。
如果你想深入挖掘和学习你还可以用杰克逊2做其他很酷的事情-去主要的Jackson教程。
进一步阅读:
2.这个问题
默认情况下,Jackson 2将只处理公共的字段,或者有一个公共getter方法序列化所有字段为private或包为private的实体将会失败:
public class MyDtoNoAccessors {String stringValue;int intValue;布尔booleanValue;MyDtoNoAccessors() {super();} //没有getter}
@Test(expected = JsonMappingException.class) public void givenObjectHasNoAccessors_whenSerializing_thenException() throws JsonParseException, IOException {String dtoAsString = new objectapper()。writeValueAsString(新MyDtoNoAccessors ());为了(dtoAsString notNullValue ());}
的完整的异常是:
jsonmappingexception:没有发现dto类的序列化器。MyDtoNoAccessors和没有发现创建BeanSerializer的属性(为了避免异常,禁用SerializationFeature.FAIL_ON_EMPTY_BEANS))
3.解决方案
显而易见的解决方案是为字段添加getter——如果实体在我们的控制之下的话。如果不是这样的话无法修改实体的来源-那么杰克逊给了我们一些选择。
3.1。全球自动检测领域与任何可见性
这个问题的第一个解决方案是全局配置objectmap检测所有字段,无论其可见度:
objectMapper.setVisibility (PropertyAccessor。场,Visibility.ANY);
这将允许检测私有和包私有字段如果没有getter,序列化就能正常工作:
@Test public void givenObjectHasNoAccessors_whenSerializingWithAllFieldsDetected_thenNoException() throws JsonParseException, IOException {objectapper objectapper = new objectapper ();objectMapper.setVisibility (PropertyAccessor。场,Visibility.ANY);string dtoasstring = ObjectMapper.WriteValueAstring(新的MyDtonoAccessors());为了(dtoAsString containsString (intValue "));为了(dtoAsString containsString (stringValue "));为了(dtoAsString containsString (booleanValue "));}
3.2。检测到类级别的所有字段
Jackson 2提供的另一个选项是-而不是全局配置-在类级别控制字段的可见性通过这一点@JsonAutoDetect注释:
@jsonautodetect(timentvisibility =可见性.Any)公共类MyDtonoAccessors {...}
有了这个注释,序列化现在应该能正确地处理这个特定的类:
@test public voidedobjecthasnoaccessorsbuthasvisiblefields_whenserializing_thennoexception()抛出jsonparseexception,ioException {objectMapper objectMapper = new objectMapper();string dtoasstring = ObjectMapper.WriteValueAstring(新的MyDtonoAccessors());为了(dtoAsString containsString (intValue "));为了(dtoAsString containsString (stringValue "));为了(dtoAsString containsString (booleanValue "));}
4.结论
本文说明了如何在Jackson中绕过默认的视野的全局配置自定义可见性objectmap或者在个别课程上。Jackson还提供了一些选项,来精确控制映射器如何查看具有特定可见性的getter、setter或字段,从而允许进一步的定制。
实现所有这些示例和代码片段可以在我的github项目-这是一个基于eclipse的项目,所以它应该很容易导入和运行。