0

Je construis une application simple à l'aide de Spring, et j'essaie d'implémenter une annotation personnalisée JSR303 pour valider le paramètre de chaîne de méthode. J'utilise le code Java pour config Spring et je pense que j'ai chargé tous les haricots dont j'ai besoin. Mais l'annotation de validation ne fonctionne toujours pas.Problème lié à l'utilisation de l'annotation JSR303 personnalisée pour valider le paramètre de méthode dans Spring mvc container

Voici le code:

Configurer Spring:

@Configuration 

@Lazy(false) 

public class MVCContainerConfig 
{ 
    @Bean 
    public AnnotationMethodHandlerAdapter annotationMethodHandlerAdapter() 
    { 
     ConfigurableWebBindingInitializer configurableWebBindingInitializer = new ConfigurableWebBindingInitializer(); 
     configurableWebBindingInitializer.setValidator(localValidatorFactoryBean()); 

     AnnotationMethodHandlerAdapter annotationMethodHandlerAdapter = new AnnotationMethodHandlerAdapter(); 
     annotationMethodHandlerAdapter.setWebBindingInitializer(configurableWebBindingInitializer); 
     annotationMethodHandlerAdapter.setMessageConverters(new HttpMessageConverter[]{ 
      new BufferedImageHttpMessageConverter(), 
      new ByteArrayHttpMessageConverter(), 
      new FormHttpMessageConverter(), 
      new ResourceHttpMessageConverter(), 
      new StringHttpMessageConverter(), 
      new AtomFeedHttpMessageConverter(), 
      new RssChannelHttpMessageConverter(), 
      new MappingJacksonHttpMessageConverter(), 
      new Jaxb2RootElementHttpMessageConverter(), 
      new MarshallingHttpMessageConverter(), 
      new XmlAwareFormHttpMessageConverter() 
     }); 

     return annotationMethodHandlerAdapter; 
    } 

    @Bean 
    public DefaultAnnotationHandlerMapping defaultAnnotationHandlerMapping() 
    { 
     DefaultAnnotationHandlerMapping defaultAnnotationHandlerMapping = new DefaultAnnotationHandlerMapping(); 
     defaultAnnotationHandlerMapping.setInterceptors(new Object[]{localeChangeInterceptor(), 
                    themeChangeInterceptor()}); 
     return defaultAnnotationHandlerMapping; 
    } 

    @Bean(name="validator") 
    public LocalValidatorFactoryBean localValidatorFactoryBean() 
    { 
     LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); 

     return localValidatorFactoryBean; 
    } 
... (ignore useless code) 
} 

définition Annotation:

@Documented 
@Constraint(validatedBy={NotEmptyOrWhitespaceValidatorImp.class}) 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
@ReportAsSingleViolation 
@NotNull 
public @interface NotEmptyOrWhitespace 
{ 
    //TODO change this when language package is ready 
    public abstract String message() default "Empty or white space error message"; 

    public abstract Class<?>[] groups() default { }; 

    public abstract Class<? extends Payload>[] payload() default { }; 

    /** 
    * Defines several {@code @NotEmptyOrWhitespace} annotations on the same element. 
    */ 
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
    @Retention(RUNTIME) 
    @Documented 
    public @interface List { 
     NotEmptyOrWhitespace[] value(); 
    } 
} 

Constraint Définition:

public class NotEmptyOrWhitespaceValidatorImp implements ConstraintValidator<NotEmptyOrWhitespace, String> 
{ 
    public void initialize(NotEmptyOrWhitespace annotation){} 

    public boolean isValid(String str, ConstraintValidatorContext constraintValidatorContext) 
    { 
     str = str.replaceAll(" ", ""); 
     return ((str == null || str.isEmpty()) ? false : true); 
    } 
} 

La méthode que je veux tester:

public boolean isOurProduct(@NotEmptyOrWhitespace String productName) 
    { 
     productName = productName.trim().toLowerCase(); 
     return this.productSet.contains(productName); 
    } 

Junit Méthode d'essai:

@Test 
     public void testIsOurProduct() 
     { 
      // If the annotation works, then I should see an exception occurred instead of the output 
      System.out.println("********* "+this.finder.isOurProduct(" ")); 
     } 
+0

Votre classe 'MVCContainerConfig' ne sera même pas compilée. S'il vous plaît donnez-nous un exemple de code qui compile. – skaffman

Répondre