我有一个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
用于测试的解析的任何想法吗?