【问题标题】:How to fail on unknown XML tags?如何在未知的 XML 标签上失败?
【发布时间】:2019-09-28 03:36:53
【问题描述】:

在我的 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...
}

我的 spring boot RestControllers 是这样的:

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

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

当反序列化带有未知标签或属性的请求时,如何让 spring boot 与 jackson 失败?

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

    <unknownTag unknownProperty="1234"/>

</Customer>

我尝试通过设置此属性将 jackson 设置为严格模式(尽管文档告诉我,无论如何它默认设置为 true),但网络服务仍然返回状态 200:

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

【问题讨论】:

    标签: java xml spring spring-boot jackson


    【解决方案1】:

    您需要检查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

    【讨论】:

      【解决方案2】:

      据我所知,Jackson 主要用于 JSON 数据。它还支持 XML 和一些 JAXB 注释。但它不支持 XML 模式验证。

      看来,您实际上是在寻找模式验证。那么你应该使用 JAXB 作为 XML 编组器。

      另见: Spring JAXB - Unmarshalling an XML document with schema validation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 2016-07-15
        • 1970-01-01
        相关资源
        最近更新 更多