如何校验Postman传入的错误参数?REST接口接收额外参数仍返回成功
解决额外参数传入时接口仍返回成功的问题
我明白你的困扰——明明给请求体加了@Valid校验,但传入多余字段(比如你例子里的"user":"admin")时接口居然还返回成功,这确实不符合预期。其实问题出在Spring默认会忽略请求体里的未知字段,@Valid注解只负责校验你定义的字段是否符合规则(比如非空、格式正确等),并不会校验是否存在多余字段。
下面给你两种可行的解决方案:
方案一:在DTO类上添加注解,单独控制该类的未知字段校验
在你的请求体对应的DTO类上添加@JsonIgnoreProperties(ignoreUnknown = false)注解,这样Jackson在反序列化时遇到未知字段就会抛出异常,Spring会自动返回400 Bad Request的错误响应。
示例代码:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import jakarta.validation.constraints.NotNull; // 若使用Spring Boot 2.x,替换为javax.validation.constraints.NotNull @JsonIgnoreProperties(ignoreUnknown = false) public class VehicleRequest { @NotNull(message = "vehicleModelId不能为空") private Long vehicleModelId; @NotNull(message = "vehicleTypeId不能为空") private Long vehicleTypeId; @NotNull(message = "vehicleManufacturerId不能为空") private Long vehicleManufacturerId; @NotNull(message = "ptoId不能为空") private Long ptoId; @NotNull(message = "orgId不能为空") private Long orgId; // 省略getter、setter方法 }
方案二:全局配置,对所有DTO生效
如果你希望所有接口的请求体都不允许出现未知字段,可以在Spring Boot的配置文件里添加全局配置:
application.properties 写法
spring.jackson.deserialization.fail-on-unknown-properties=true
application.yml 写法
spring: jackson: deserialization: fail-on-unknown-properties: true
配置生效后,任何请求体包含DTO未定义的字段时,都会触发Jackson的反序列化异常,接口直接返回400错误。
额外注意事项
请确保你的Controller方法里确实正确使用了@Valid注解,比如:
@RestController @RequestMapping("/vehicles") public class VehicleController { @PostMapping public ResponseEntity<?> createVehicle(@Valid @RequestBody VehicleRequest request) { // 业务逻辑处理 return ResponseEntity.ok("创建成功"); } }
把上面的配置和正确的@Valid使用结合起来,就能实现“传入额外参数时返回错误响应”的需求啦!
内容的提问来源于stack exchange,提问作者Praveen Kumar
相关产品推荐
相关产品推荐

