-1

Spécifications: mise en veille prolongée validateur [5.2.4.Final], le printemps contexte [4.2.2.RELEASE]groupe validation Spécification des à utiliser pour un haricot

Je suis en train de faire la solution décrite here travail au dessous de. Mais il n'y a pas de violations de contraintes rencontrées & les choses passent juste bien. Pourquoi?

J'ai deux haricots, un parent, un autre enfant. La définition de l'enfant est comme ci-dessous

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

} 

La définition de haricot Parent est comme ci-dessous:

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


} 

La classe de test est aussi

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



} 

Soit dit en passant, j'ai installé niveau de ressort approprié haricots comme ci-dessous & cela fonctionne bien sans groupes (j'ai commenté les lignes de validation dans le code ci-dessus sans groupes pour le cas de travail). Donc ce n'est pas le problème :)

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

et que voulez-vous dire par" ça fonctionne bien sans groupes "? J'ai essayé de reproduire votre scénario, et supprimé le code de groupe SampleBean et SampleBeanParent, mais cela a abouti à "terminé avec succès" aussi – hammerfest

+0

J'ai ajouté des instructions de commentaire pour montrer le cas normal de toutes les contraintes appartenant à défaut où cela fonctionne bien. Il suffit de les décommenter et de commenter les lignes liées au groupe – nikel

Répondre

0

Je pourrais le faire de la façon suivante. Les classes modifiées sont les suivantes (je l'ai enlevé tout du code qui semblait être le point de vue du problème particulier redondant/inutile)

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

} 

S'il vous plaît se référer également à ce fil: Spring @Validated in service layer, il contient plusieurs points utiles, entre autres citations de l'une des réponses:

"L'annotation @Validated n'est utilisée que pour spécifier un groupe de validation, elle ne force pas elle-même toute validation Vous devez utiliser l'une des annotations javax.validation, comme @ Null ou @Valid. " La dernière réponse traite du cas spécifique où il y a une autre annotation sur le paramètre de la méthode en plus de @Valid comme dans votre cas, il y avait aussi @NotNull (message = " enfant ne peut pas être nul ")

+0

Le lien vers une autre réponse m'a beaucoup aidé :). J'espérais qu'il y aurait un moyen de spécifier quels groupes de validation utiliser pour un paramètre de méthode particulier. On dirait que cela ne peut être fait qu'au niveau de la classe et de la méthode et pas au niveau du paramètre de la méthode. – nikel