
spring boot应用在处理xml请求体时,默认情况下jackson反序列化器会静默忽略dto中未定义的xml属性。为提升数据校验的严格性和安全性,本文将指导如何在spring boot中配置jackson,使其在遇到请求体中包含dto未定义属性时抛出异常,从而强制执行严格的数据模型匹配。
在Spring Boot应用中,当使用Jackson处理XML或JSON请求体时,如果传入的数据包含目标数据传输对象(DTO)中未定义的属性,Jackson的默认行为是静默地忽略这些未知属性,而不是抛出错误。这在某些场景下可能方便,但在需要严格数据校验的API中,却可能导致以下问题:
以下是一个典型的Kotlin/Java Spring Boot控制器和DTO示例,展示了这种默认行为:
DTO定义:
// Kotlin
data class Data(
val item: String
)
// Java
public class Data {
private String item;
public Data() {} // Default constructor for Jackson
public Data(String item) {
this.item = item;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
}Spring Boot控制器:
// Kotlin
@RestController
@RequestMapping("/api")
class DataController {
@PostMapping("/data", consumes = [MediaType.APPLICATION_XML_VALUE])
fun pushMasterData(@RequestBody data: Data): Data {
println("Received item: ${data.item}")
return data
}
}
// Java
@RestController
@RequestMapping("/api")
public class DataController {
@PostMapping(value = "/data", consumes = MediaType.APPLICATION_XML_VALUE)
public Data pushMasterData(@RequestBody Data data) {
System.out.println("Received item: " + data.getItem());
return data;
}
}当向/api/data端点发送如下XML请求体时:
<items> <item>foo</item> <trash>This should not be allowed!</trash> </items>
在默认配置下,Spring Boot应用会成功处理请求,并打印Received item: foo,而对<trash>标签的存在视而不见。
为了强制Jackson在反序列化过程中遇到DTO中未定义的属性时抛出异常,我们可以通过Spring Boot的配置属性来启用Jackson的严格模式。
核心配置属性是:
spring.jackson.deserialization.fail-on-unknown-properties=true
将此配置添加到你的application.properties或application.yml文件中即可。
配置原理:
Spring Boot的自动配置机制会将spring.jackson.deserialization.fail-on-unknown-properties属性映射到Jackson ObjectMapper实例的DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES特性。当此特性被设置为true时,Jackson在尝试将输入流(如XML或JSON)反序列化为Java对象时,如果遇到在目标Java类中没有对应字段的属性,就会抛出UnrecognizedPropertyException异常。
让我们将上述配置应用到之前的Spring Boot项目中。
创建或修改application.properties文件:
在src/main/resources/application.properties文件中添加:
spring.jackson.deserialization.fail-on-unknown-properties=true
或者,如果你偏好YAML格式,在application.yml中添加:
spring:
jackson:
deserialization:
fail-on-unknown-properties: trueDTO和Controller保持不变:
使用之前定义的Data DTO和DataController。
测试请求:
再次向/api/data端点发送包含未知属性的XML请求:
<items> <item>foo</item> <trash>This should not be allowed!</trash> </items>
预期结果:
此时,Spring Boot应用将不再接受此请求,而是会返回一个HTTP 400 Bad Request错误,并在响应体中包含Jackson抛出的UnrecognizedPropertyException异常信息,明确指出哪个未知属性导致了反序列化失败。例如:
{
"timestamp": "...",
"status": 400,
"error": "Bad Request",
"message": "Unrecognized field \"trash\" (class com.example.demo.Data), not marked as ignorable\n at [Source: (PushbackInputStream); line: 3, column: 15] (through reference chain: com.example.demo.Data[\"trash\"])",
"path": "/api/data"
}全局生效: spring.jackson.deserialization.fail-on-unknown-properties=true配置是全局性的,它会影响应用中所有通过Jackson进行反序列化的操作。这意味着所有XML和JSON请求体都会受到此严格校验的约束。
局部控制: 如果你希望大多数DTO保持严格校验,但某些特定DTO需要忽略未知属性,可以使用Jackson的@JsonIgnoreProperties注解。例如:
@JsonIgnoreProperties(ignoreUnknown = true)
public class LenientData {
private String field1;
// ...
}当一个类上存在@JsonIgnoreProperties(ignoreUnknown = true)注解时,它会覆盖全局配置,使得该特定DTO在反序列化时忽略未知属性。
XML与JSON通用性: 尽管本教程以XML为例,但fail-on-unknown-properties配置同样适用于JSON请求体的反序列化。Jackson是Spring Boot默认的JSON处理器,而通过jackson-dataformat-xml库,它也能处理XML。
错误处理: 当Jackson抛出UnrecognizedPropertyException时,Spring Boot的默认错误处理机制会将其封装为HTTP 400 Bad Request响应。在生产环境中,你可能需要自定义全局异常处理器(例如使用@ControllerAdvice),以提供更友好或更详细的错误信息给客户端。
通过简单地在application.properties中设置spring.jackson.deserialization.fail-on-unknown-properties=true,我们可以显著提升Spring Boot应用在处理XML(和JSON)请求体时的健壮性和安全性。这种配置强制执行严格的数据模型匹配,有助于及早发现和纠正客户端发送的错误数据,从而构建更可靠、更易于维护的API服务。在大多数业务场景下,推荐启用此配置以确保数据输入的严格性。
以上就是Spring Boot与Jackson:强制XML反序列化拒绝未知属性的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号