Я создаю простое приложение с использованием 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(" "));
}
Ваш класс MVCContainerConfig даже не будет скомпилирован. Пожалуйста, дайте нам пример кода, который компилируется. – skaffman 2010-11-29 09:53:14