0

Я создаю простое приложение с использованием Spring, и я пытаюсь реализовать аннотацию JSR303 для проверки параметра строки метода. Я использую Java-код для конфигурации контейнера Spring, и я думаю, что я загрузил все весенние бобы, которые мне нужны. Но аннотация валидации все еще не работает.Проблема с использованием пользовательской аннотации JSR303 для проверки параметра метода в контейнере Spring mvc

Вот код:

Настройка 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) 
} 

Аннотация: определение

@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:

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

Метод, который я хочу, чтобы тест:

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

Junit Метод испытания:

@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

Ваш класс MVCContainerConfig даже не будет скомпилирован. Пожалуйста, дайте нам пример кода, который компилируется. – skaffman 2010-11-29 09:53:14

ответ