Java Jackson XML Base64编码标签反序列化问题求助
问题:XML反序列化时处理Base64编码的Customer节点
API响应示例
<WebResponse> <RequestId>6541635537</RequestId> <Items> <Item> <Id>1aSd</Id> <Name>spider</Name> </Item> <Item> <Id>2sze</Id> <Name>catman</Name> </Item> </Items> <Customer>PEN1c3RvbWVyPg0KIDxOYW1lPk5pY288L05hbWU+DQogPEFjY291bnRzPg0KICA8QWNjb3VudD4NCiAgIDxUeXBlPlBSTzwvVHlwZT4NCiAgPC9BY2NvdW50Pg0KICA8QWNjb3VudD4NCiAgIDxUeXBlPlBST01BWDwvVHlwZT4NCiAgPC9BY2NvdW50Pg0KIDwvQWNjb3VudHM+DQo8L0N1c3RvbWVyPg==</Customer> </WebResponse>
解码后的Customer节点内容
<Customer> <Name>Nico</Name> <Accounts> <Account> <Type>PRO</Type> </Account> <Account> <Type>PROMAX</Type> </Account> </Accounts> </Customer>
当前尝试的代码
ObjectMapper MAPPER = new XmlMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); WebResponse result = MAPPER.readerFor(WebResponse.class).readValue(webResponse);
抛出的异常
Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of org.Customer (although at least one Creator exists): no String-argument
解决思路
- 核心问题:Jackson默认会把Customer节点的Base64字符串直接尝试反序列化为Customer对象,类型不匹配导致异常,必须先解码再反序列化。
- 实现步骤:
- 临时DTO中转:创建一个临时的
WebResponseTemp类,其中Customer字段定义为String类型,先用XmlMapper解析原始XML得到这个临时对象,提取出Base64编码的字符串。 - Base64解码:将提取到的字符串解码为XML格式的字符串(注意处理字符编码,确保解码后是正确的XML内容)。
- 解析Customer对象:用XmlMapper将解码后的XML字符串解析为
Customer对象。 - 组装最终对象:创建正式的
WebResponse对象,将临时对象中的RequestId、Items等字段赋值,再把解析好的Customer对象注入进去。
- 临时DTO中转:创建一个临时的
- 进阶方案:自定义
Customer字段的反序列化器,通过@JsonDeserialize(using = CustomCustomerDeserializer.class)注解添加到WebResponse的Customer字段上,在反序列化器内部完成Base64解码和XML解析的逻辑,实现自动处理。
内容的提问来源于stack exchange,提问作者user22210101
相关产品推荐
相关产品推荐

