如何为字符串类型的@RequestBody实现自定义校验器?
问题原因与解决方案
核心问题
你的自定义校验器未被触发,主要有两个关键原因:
- Spring MVC默认不会自动触发方法参数的校验,需要显式开启方法级校验
- 校验器的
initialize方法参数类型错误,导致校验器无法正确初始化绑定到自定义注解
修复步骤
1. 开启方法级参数校验
在你的控制器类上添加@Validated注解(Spring框架提供,专门用于启用方法参数的校验功能):
@RestController @Validated // 必须添加此注解才能触发参数校验逻辑 public class YourController { @RequestMapping(value = "/endpoint", method = { RequestMethod.POST }) @ResponseBody public ResponseEntity<String> authorize(@RequestBody @MyValidator String token) { // 业务逻辑 } }
2. 修正校验器的初始化方法
你的JsonSyntaxValidator中initialize方法的参数类型错误,应该传入自定义的MyValidator注解,而非JsonFormat,否则校验器无法正确绑定到你的注解:
public class JsonSyntaxValidator implements ConstraintValidator<MyValidator, String> { @Override public void initialize(MyValidator constraintAnnotation) { // 若需要根据注解参数做初始化逻辑可在此实现,无需则留空 } @Override public boolean isValid(String token, ConstraintValidatorContext constraintValidatorContext) { boolean isValid = true; try { JsonParser.parseString(token); } catch (JsonSyntaxException e) { isValid = false; } return isValid; } }
3. 确保校验依赖存在
如果是Spring Boot项目,确保构建文件中包含校验依赖:
Maven(pom.xml)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
Gradle(build.gradle)
implementation 'org.springframework.boot:spring-boot-starter-validation'
非Spring Boot项目则需手动引入spring-context和hibernate-validator相关依赖。
4. 调整请求Content-Type(可选)
如果你的请求体是纯字符串而非标准JSON结构,需将请求的Content-Type设置为text/plain,避免Spring自动尝试将其解析为JSON对象导致提前报错。若必须使用application/json,可配置消息转换器强制将请求体转为字符串:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8)); } }
测试验证
修改完成后,用Postman发送非JSON格式的字符串请求,此时自定义校验器会被正常触发,返回你配置的错误提示信息。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

