Указание, какую группу проверки использовать для bean-компонента

Спецификации: hibernate-validator[5.2.4.Final], spring-context[4.2.2.RELEASE]

Я пытаюсь заставить решение, описанное здесь, работать, как показано ниже. Но нарушений ограничений не обнаружено, и все проходит нормально. Почему?

У меня есть два боба, один родитель, другой ребенок. Детское определение приведено ниже.

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;
    }

}

Определение родительского компонента выглядит следующим образом:

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");
        }
    }



}

Кстати, я настроил соответствующие bean-компоненты уровня Spring, как показано ниже, и он отлично работает без групп (я прокомментировал строки проверки в приведенном выше коде без групп для рабочего случая). Так что проблема не в этом :)

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();
    }
}

person nikel    schedule 14.10.2016    source источник
comment
и что значит нормально работает без групп? Я попытался воспроизвести ваш сценарий и удалил код, связанный с группой, из SampleBean и SampleBeanParent, но это также привело к успешному завершению   -  person hammerfest    schedule 14.10.2016
comment
я добавил операторы комментариев, чтобы показать нормальный случай всех ограничений, принадлежащих умолчанию, где он работает нормально. Просто раскомментируйте их и прокомментируйте строки, связанные с группой.   -  person nikel    schedule 14.10.2016


Ответы (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 на сервисном уровне, она содержит несколько полезных пункты, среди прочего цитируемые из одного из ответов:

«Аннотация @Validated используется только для указания группы проверки, сама по себе она не требует проверки. Вам нужно использовать одну из аннотаций javax.validation, например @Null или @Valid». - указание на то, что @Validated(Group1.class) SampleBean childBean в вашем примере кажется неверным

В последнем ответе обсуждается конкретный случай, когда в параметре метода есть еще одна аннотация, кроме @Valid, как в вашем случае, также была @NotNull (message = "child не может быть null")

person hammerfest    schedule 14.10.2016
comment
Ссылка на другой ответ мне очень помогла :). Я надеялся, что будет способ указать, какие группы проверки использовать для конкретного параметра метода. Похоже, это можно сделать только на уровне класса и метода, а не на уровне параметра метода. - person nikel; 15.10.2016