【问题标题】:ObjectMapper is trying to parse string as json instead of xmlObjectMapper 试图将字符串解析为 json 而不是 xml
【发布时间】:2020-09-28 13:31:09
【问题描述】:

我正在尝试使用自定义反序列化器在 Spring Boot 测试中解析 XML。

@SpringBootTest
public class MyTest {

    @Autowired
    ObjectMapper mapper;

    @Test
    public void shouldParseXmlString() {
        final String input = "<abc>value</abc>"  // Some XML string which is valid xml
        MyClass myClass = mapper.readValue(input, MyClass.class);
        assertEquals("value", myClass.getAbc());
    }
}

我有一个自定义反序列化器,它扩展了 JsonDeserializer&lt;MyClass&gt; 并将 xml 反序列化为 MyClass。当我直接使用XmlMapper 注入它时效果很好,但是当我尝试在测试中注入ObjectMapper 时它会失败并出现以下错误。

com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)) expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')

如错误所示,它试图将输入字符串解析为 json 而不是 xml。如何通过注入 ObjectMapperXmlMapper 来解析 xml?

pom.xml 中,我添加了jackson-corejackson-dataformat-xml 作为版本2.10.0 的依赖项

【问题讨论】:

  • 答案有帮助吗?

标签: java xml spring-boot jackson jackson-dataformat-xml


【解决方案1】:

自动装配 ObjectMapper 只会按类型自动装配 ObjectMapper bean。您所期望的是将 XmlMapper 注入ObjectMapper 类型的变量。假设您有一个 XmlMapper bean 定义为

@Bean
public XmlMapper xmlMapper(){
    return new XmlMapper();
}

你可以通过名字将它注入到ObjectMapper变量中

@Qualifier("xmlMapper")
@Autowired
private ObjectMapper mapper;

【讨论】:

  • 这对我不起作用,因为我需要在自定义反序列化器中注入依赖项,而当你这样做时 new XmlMapper() spring boot 不会注入依赖项。
  • 你只需要注入正确的bean。你在哪里定义了XmlMapper的bean?
  • 我认为不必单独定义它,因为 spring 为杰克逊提供了一流的支持,可以反序列化 xml 的 bean 应该已经可用。我可以在没有定义的情况下注入ObjectMapper,但不能注入XmlMapper,因为spring 不会将XmlMapper 暴露为bean。所以我正在寻找正确的方法来注入可以反序列化 xml 而无需明确定义它的 bean。
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 2010-10-08
相关资源
最近更新 更多