gpt4 book ai didi

java - 如何在未知 XML 标签上失败?

转载 作者:行者123 更新时间:2023-11-30 05:38:58 29 4
gpt4 key购买 nike

在我的 Spring Boot 2.1 应用程序中,我想提供一个 XML-HTTP-API。

基于现有的 XSD-Schema,我生成了 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 RestController 看起来像这样:

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

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

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

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

<unknownTag unknownProperty="1234"/>

</Customer>

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

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

最佳答案

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

关于java - 如何在未知 XML 标签上失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56074001/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com