【问题标题】:Spring 3.2 validation on generic typesSpring 3.2 对泛型类型的验证
【发布时间】:2017-05-21 16:49:09
【问题描述】:

我有一个如下所示的界面:

@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 很相似):

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的控制器,比如:

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

现在,控制器上的验证根本不起作用。我可以放一个空的id,或者一个空的数字,不会引发异常。 Spring 验证泛型类型有什么特别的事情要做吗?任何解决方法?这个问题用 Spring boot 解决了吗?

编辑: 我还定义了以下 bean,以便 Spring 可以进行验证:

@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。还是我错了?

【问题讨论】:

  • 你如何实例化/访问它们?
  • 我编辑了问题以展示我如何使用我的对象
  • 你搞定了吗?

标签: java spring validation spring-mvc generics


【解决方案1】:

要向服务方法添加验证,您需要添加 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多