有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java指定用于bean的验证组

规范:hibernate验证程序[5.2.4.Final],spring上下文[4.2.2.RELEASE]

我正试图使here 描述的解决方案如下所示。但没有遇到违反约束的情况&;一切都很顺利。为什么?

我有两个孩子,一个是父母,另一个是孩子。儿童定义如下

package code;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

@Service("SampleBean")
@Validated
public class SampleBean {

    @NotNull(message= "value can not be null" , groups = Group1.class)
//  @NotNull(message= "value can not be null")
    private Integer value;

    @NotNull(message= "value1 can not be null" , groups = Group2.class)
//  @NotNull(message= "value can not be null" )
    private Integer value1;

    public Integer getValue() {
        return value;
    }

    public void setValue(@NotNull 
            Integer value) {
        this.value = value;
    }

    public Integer getValue1() {
        return value1;
    }

    public void setValue1(Integer value1) {
        this.value1 = value1;
    }

}

父bean定义如下:

package code;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;

import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

@Service("SampleBeanParent")
@Validated
public class SampleBeanParent {


    public void acceptChildBean(@NotNull(message = "child cannot be null") 
//  @Valid
    @Validated(Group1.class)
    SampleBean childBean) throws NoSuchMethodException, SecurityException{
        System.out.println("successfully finished");
    }


}

测试类如下所示

package code;
import java.util.ArrayList;
import java.util.List;

import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {


    public static void main(String[] args) throws NoSuchMethodException, SecurityException{


        ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        SampleBean sampleBean = (SampleBean) context.getBean("SampleBean");

        try{
            SampleBeanParent parent = (SampleBeanParent) context.getBean("SampleBeanParent");
            parent.acceptChildBean(sampleBean);

        }
        catch(ConstraintViolationException e){
            System.out.println("there were validation errors");
        }
    }



}

顺便说一下,我已经设置了适当的spring级别bean,如下所示&;它在没有组的情况下工作得很好(我已经对上面代码中的验证行进行了注释,没有工作案例的组)。所以这不是问题:)

package code;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;

@Configuration
@ComponentScan(basePackageClasses = {SampleBean.class})
public class SpringConfiguration {

    @Bean(name = "validator")
    public LocalValidatorFactoryBean initValidatorFactory(){
        return new LocalValidatorFactoryBean();
    }

    @Bean
    public MethodValidationPostProcessor initValidationPostProcessor(){
        return new MethodValidationPostProcessor();
    }
}

共 (1) 个答案

  1. # 1 楼答案

    我可以这样做。更改的类如下所示(从特定问题的角度来看,我删除了代码中似乎多余/不必要的所有内容)

    @Service("SampleBeanParent")
    @Validated(Group1.class)
    public class SampleBeanParent {
    
        public void acceptChildBean(
                @Valid SampleBean childBean) throws NoSuchMethodException, SecurityException {
            System.out.println("successfully finished");
        }
    
    }
    
    @Service("SampleBean")
    public class SampleBean {
    
        @NotNull(message = "value can not be null", groups = Group1.class)
        private Integer value;
    
        public Integer getValue() {
            return value;
        }
    
        public void setValue(Integer value) {
            this.value = value;
        }
    
    }
    

    还请参考此线程:Spring @Validated in service layer,它包含几个有用的要点,其中引用了其中一个答案:

    “@Validated注释仅用于指定验证组,它本身并不强制任何验证。您需要使用javax.validation注释之一,如@Null或@Valid。”-指示示例中的@Validated(Group1.class) SampleBean childBean似乎不正确

    最后一个答案是讨论在方法参数上除了@Valid之外还有另一个注释的具体情况,就像在您的例子中还有@NotNull(message=“child cannot be null”)