Проблема с использованием пользовательской аннотации JSR303 для проверки параметра метода в контейнере Spring mvc - PullRequest
0 голосов
/ 29 ноября 2010

Я создаю простое приложение с использованием Spring и пытаюсь реализовать пользовательскую аннотацию JSR303 для проверки строкового параметра метода. Я использую код Java для конфигурирования контейнера Spring и думаю, что я загрузил все необходимые мне bean-компоненты 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();
    }
}

Определение ограничения:

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

1 Ответ

0 голосов
/ 06 февраля 2011

См. Проверка параметров метода с помощью JSR-303 . Вам необходимо запустить проверку с использованием AOP при вызове метода.

...