获取@RestController中使用的ObjectMapper

时间:2019-05-28 10:24:29

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

我有一个Spring Boot @RestController,它有一个上传对象,该对象将对象作为输入。

 public ResponseEntity<Void> upload(String productId, Boolean dryrun, ProductConfig product) 

此端点接收其中带有ProductConfig的xml文件。我有一些用于重命名xml元素和配置的Jackson注释,默认情况下在Jackson2ObjectMapperBuilder上使用未包装的列表,并且工作正常。

所以我的问题是,我现在需要在一个测试中使用这个ObjectMapper来从资源中解析其中一个xml文件。我尝试了两种不同的方法:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class TestIntegrationTest {

    @Autowired ObjectMapper mapper;

    @Test
    public void test() throws Exception{

        Resource res = new ClassPathResource("SimpleConfig.xml");
        ProductConfig conf = mapper.readValue(res.getFile(), ProductConfig.class);
    }
}

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class TestIntegrationTest {

    @Test
    public void test() throws Exception{
        XmlMapper mapper = new XmlMapper();
        mapper.setDefaultUseWrapper(false);

        Resource res = new ClassPathResource("SimpleConfig.xml");
        ProductConfig conf = mapper.readValue(res.getFile(), ProductConfig.class);
    }
}

第一个是我希望可以使用的那个,但是它崩溃并在'<'字符上出现解析异常,这似乎是要解析json而不是xml,但是在@RestController中得到完美的解析,...还是ObjectMapper而不是对@RestController进行解析的类?

在第二个示例中,它无法解析某些嵌套类,即ProductConfig可以具有Unit的列表,这是<unit>子元素的未包装列表。该模型的各个部分是:

  @JsonProperty("units")
  @JacksonXmlProperty(localName = "unit")
  @Valid
  private List<Unit> units = null;

这仅在我将xml上传到其余端点时有效,而当我手动调用XmlMapper时不起作用。

xml看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<product name="foobar">
    <unit  target="config">
        <property name="prop1" value="foo"/>

        <unit target="sub1">
            <property name="prop1" value="foo"/>
            <property name="prop2" value="bar"/>
            <property name="prop3" value="blah"/>
        </unit>
        <unit target="sub2">
           ....
        </unit>
        ...
    </unit>
</product>

关于如何重现@RestController用于测试的解析的任何想法吗?

0 个答案:

没有答案