Получите ObjectMapper, который используется в @RestController - PullRequest
0 голосов
/ 28 мая 2019

У меня есть Spring Boot @RestController, у которого есть конечный загрузчик, который получает объект в качестве входных данных.

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

Эта конечная точка получает XML-файл с ProductConfig.У меня есть несколько аннотаций Джексона для переименования элементов xml и конфигурации для использования развернутых списков по умолчанию на 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, но в <code>@RestController он анализируется идеально, ... или ObjectMapper просто не тот класс, который выполняет синтаксический анализ для @RestController?

Во втором примере он не может выполнить синтаксический анализ некоторых вложенных классов, а именно ProductConfig может иметь список Unit s, который является развернутым списком <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 делает для тестов?

...