Spring 3.2对泛型类型的验证 [英] Spring 3.2 validation on generic types

查看:444
本文介绍了Spring 3.2对泛型类型的验证的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个看起来像这样的界面:

I have an interface which looks like this:

@Validated
public interface Service<T extends Foo, N extends Bar> {
    @Valid
    @NotNull
    T doStuff(@Valid N bar);
}

另外一个扩展它:

public interface PhoneService extends Service<PhoneFoo, PhoneBar> {
}

我的对象Foo和PhoneFoo看起来像这样(并且Bar和PhoneBar相似):

My objects Foo and PhoneFoo look like this (and Bar and PhoneBar are similar) :

public abstract class Foo {

    @NotBlank(message = "Missing id")
    @Size(max = 50, message = "Invalid id")
    private String id;
}

public class PhoneFoo extends Foo {
    @NotBlank(message = "Missing number")
    @Size(max = 50, message = "Invalid number")
    private String number;
}

最后,我基本上有一个实现PhoneService的控制器,例如:

Finally, I basically have a controller implementing PhoneService, such as:

@Controller
public final class PhoneServiceController implements PhoneService {
    @RequestMapping(...)
    @Override
    @ResponseBody
    PhoneFoo doStuff(@RequestBody final PhoneBar bar) {
        // Do things...
    }
}

现在,在控制器上的验证根本不起作用.我可以输入一个空的ID或一个空的数字,并且不会引发异常. Spring验证泛型类型需要做些特殊的事情吗?任何解决方法?使用Spring Boot解决了吗?

Now, the validation on the controller just doesn't work at all. I can put an empty id, or an empty number, and no exception will be raised. Is there something special to do for Spring to validate generic types? Any workaround? Is this resolved with Spring boot?

我确实也定义了以下bean,以便Spring可以进行验证:

I do have the following beans defined as well, so that Spring can pick up on validation:

@Bean
public static MethodValidationPostProcessor methodValidationPostProcessor() {
    MethodValidationPostProcessor postProcessor = new MethodValidationPostProcessor();
    postProcessor.setProxyTargetClass(true);
    postProcessor.setValidator(validator());
    return postProcessor;
}

@Bean
public static Validator validator() {
    HibernateValidatorConfiguration configuration = (HibernateValidatorConfiguration) Validation
            .byDefaultProvider().configure();
    return configuration
            .messageInterpolator(
                    new ValueFormatterMessageInterpolator(configuration
                            .getDefaultMessageInterpolator())).buildValidatorFactory()
            .getValidator();
}

注意:在引入通用接口之前,我的项目中的验证过去工作正常.在我看来,Spring不知道如何处理 @Valid N bar .还是我错了?

Note: Validation in my project used to work fine, before I introduced a generic interface. It seems to me that Spring doesn't know how to handle @Valid N bar. Or am I wrong?

推荐答案

要将验证添加到服务方法中,您需要添加MethodValidationPostProcessor的实例.

To add validation to your service methods, you'll need to add an instance of MethodValidationPostProcessor.

@Bean
@ConditionalOnMissingBean(type = "javax.validation.Validator")
public LocalValidatorFactoryBean localValidatorFactoryBean() {
    return new LocalValidatorFactoryBean();
}

@Bean
@Autowired
@ConditionalOnMissingBean(type = "org.springframework.validation.beanvalidation.MethodValidationPostProcessor")
public MethodValidationPostProcessor methodValidationPostProcessor(Validator validator) {
    MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();
    methodValidationPostProcessor.setValidator(validator);
    return methodValidationPostProcessor;
}

@请参见 http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/validation/beanvalidation/MethodValidationPostProcessor.html

这篇关于Spring 3.2对泛型类型的验证的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆