Spring Boot中Immutable对象的Javax Validation无需get前缀如何实现
解决方案
默认情况下Hibernate Validator(Javax Validation的默认实现)遵循JavaBean规范,只会识别带get/is前缀的无参方法作为属性访问器,因此加在无get前缀方法上的校验注解不会被扫描触发,可通过以下方案解决:
方案1:自定义校验属性访问策略(推荐)
- 实现Hibernate Validator的属性访问命名策略,将所有无参非void返回值的方法都识别为属性getter,直接用方法名作为属性名:
import org.hibernate.validator.spi.naming.PropertyAccessorNamingStrategy; import java.lang.reflect.Method; public class ImmutablesAccessorNamingStrategy implements PropertyAccessorNamingStrategy { @Override public String getPropertyName(Method method) { return method.getName(); } @Override public boolean isGetterMethod(Method method) { return method.getParameterCount() == 0 && method.getReturnType() != void.class; } }
- 在Spring Boot中注册自定义策略为全局校验配置:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; @Configuration public class ValidationConfig { @Bean public LocalValidatorFactoryBean validator() { LocalValidatorFactoryBean factory = new LocalValidatorFactoryBean(); factory.getValidationPropertyMap().put( "hibernate.validator.property_accessor_naming_strategy", ImmutablesAccessorNamingStrategy.class.getName() ); return factory; } }
配置完成后即可直接用无get前缀的方法定义校验规则:
@Value.Immutable public interface Entity { @Min(19) int age(); @NotBlank @Size(min = 10) String name(); }
方案2:配合Immutables样式配置
如果需要同时适配JavaBean规范和无前缀方法,可在Immutables样式注解中指定空的get前缀,同时保留上面的校验策略配置:
@Value.Style(get = "", beanFriendlyModifiers = false) @Value.Immutable public interface Entity { @Min(19) int age(); @NotBlank @Size(min = 10) String name(); }
注意事项
如果用Jackson做反序列化,需要同步配置Jackson识别无get前缀的方法:可在方法上加@JsonProperty注解,或全局配置Jackson的属性访问策略匹配校验规则,避免反序列化失败。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

