Как потерпеть неудачу на неизвестных тегах XML? - PullRequest
1 голос
/ 10 мая 2019

В моем приложении Spring Boot 2.1 я хочу предоставить XML-HTTP-API.

Основываясь на существующей XSD-схеме, я сгенерировал Java-классы (используя jaxb). Сгенерированный код выглядит примерно так:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "CustomerRequestType", propOrder = {
    "firstName",
    "lastName"
})
public class CustomerRequestType {

    @XmlElement(name = "firstName")
    protected List<FirstNameType> firstName;
    @XmlElement(name = "lastName")
    protected List<LastNameType> lastName;

    // ...getter methods...
}

Мои весенние загрузочные RestControllers выглядят так:

@RestController
@RequestMapping("customer.xml")
public class CustomerController {

    @PostMapping
    public CustomerResponseType postCustomer(@RequestBody CustomerRequestType anfrage) {
      // ...business code...
    }
}

Как разрешить сбой весенней загрузки с Джексоном при десериализации запросов с неизвестными тегами или такими свойствами?

<Customer>
    <firstName>Bob</firstName>
    <lastName>Schmitt</lastName>

    <unknownTag unknownProperty="1234"/>

</Customer>

Я попытался установить Джексона в строгом режиме, установив это свойство (хотя в документах говорилось, что в любом случае оно установлено на true по умолчанию), но веб-служба по-прежнему возвращает статус 200:

spring.jackson.deserialization.fail-on-unknown-properties=true

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Вам необходимо проверить, какой конвертер используется Spring-Boot для десериализации полезной нагрузки XML. В вашем случае это может быть Jaxb2RootElementHttpMessageConverter. Чтобы использовать Jackson свойства, вам нужно использовать MappingJackson2XmlHttpMessageConverter, который может проверять неизвестные свойства и выдавать UnrecognizedPropertyException исключение. Для настройки конфигурации Jackson мы можем использовать Jackson2ObjectMapperBuilderCustomizer bean.

Взгляните на пример ниже:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.util.List;

@Configuration
public class JacksonMvcConfiguration extends WebMvcConfigurationSupport {

    @Autowired
    private Jackson2ObjectMapperBuilderCustomizer customizer;

    public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter() {
        Jackson2ObjectMapperBuilder xmlBuilder = Jackson2ObjectMapperBuilder.xml();
        customizer.customize(xmlBuilder);

        return new MappingJackson2XmlHttpMessageConverter(xmlBuilder.build());
    }

    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(mappingJackson2XmlHttpMessageConverter());

        super.configureMessageConverters(converters);
    }
}

Если вы хотите использовать Jackson для десериализации классов с аннотацией JAXB, рассмотрите возможность использования JaxbAnnotationModule .

0 голосов
/ 10 мая 2019

Насколько я знаю, Джексон в основном используется для данных JSON.Он также поддерживает XML и некоторые JAXB-аннотации.Но он не поддерживает проверку схемы XML.

Кажется, вы действительно ищете проверку схемы.Затем вы должны использовать JAXB в качестве XML-маршаллера.

Также см .: Spring JAXB - демонтаж XML-документа с проверкой схемы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...