OpenApi Generator控制器验证器问题:Optional参数校验异常咨询
解决方法
1. 自定义OpenApi Generator模板
OpenApi Generator支持通过Freemarker模板自定义生成代码的结构,你可以修改参数相关模板,让校验注解生成在Optional的泛型类型上:
- 找到Java Spring对应的模板文件(比如
api.mustache或parameter.mustache,具体路径取决于generator版本和类型) - 调整模板中校验注解与Optional包装的逻辑,将原本直接加在
Optional<T>上的注解,改为添加到泛型T上,最终生成Optional<@Min(1) @Max(10) Long>这样的代码结构。
2. 注册Optional类型的自定义校验器(临时方案)
如果不想修改模板,可以给Spring Validation添加支持Optional的校验适配器,让框架能识别Optional内部的注解:
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import javax.validation.constraintvalidation.SupportedValidationTarget; import javax.validation.constraintvalidation.ValidationTarget; import java.util.Optional; import javax.validation.constraints.Min; @SupportedValidationTarget(ValidationTarget.PARAMETERS) public class OptionalMinValidator implements ConstraintValidator<Min, Optional<? extends Number>> { private long minValue; @Override public void initialize(Min constraintAnnotation) { this.minValue = constraintAnnotation.value(); } @Override public boolean isValid(Optional<? extends Number> value, ConstraintValidatorContext context) { if (value == null || !value.isPresent()) { return true; // 非必填参数,空值不触发校验 } Number num = value.get(); return num.longValue() >= minValue; } }
再注册对应的Max校验器,然后在配置类中声明这些校验器:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; import javax.validation.constraints.Max; @Configuration public class ValidationConfig { @Bean public LocalValidatorFactoryBean validator() { LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean(); factoryBean.getConstraintValidatorFactory().getInstance(OptionalMinValidator.class); factoryBean.getConstraintValidatorFactory().getInstance(OptionalMaxValidator.class); return factoryBean; } }
3. 检查Generator内置配置参数
部分新版本的OpenApi Generator可能提供了现成配置项,控制校验注解的生成位置(比如类似use-inner-annotations-for-optional的参数),可以查看对应版本的官方文档确认,若存在则直接在generator配置中启用即可。
内容的提问来源于stack exchange,提问作者Suule
相关产品推荐
相关产品推荐

