You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中Immutable对象的Javax Validation无需get前缀如何实现

解决方案

默认情况下Hibernate Validator(Javax Validation的默认实现)遵循JavaBean规范,只会识别带get/is前缀的无参方法作为属性访问器,因此加在无get前缀方法上的校验注解不会被扫描触发,可通过以下方案解决:

方案1:自定义校验属性访问策略(推荐)

  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;
    }
}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:48:03