Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring 3.2泛型类型的验证_Java_Spring_Validation_Spring Mvc_Generics - Fatal编程技术网

Java Spring 3.2泛型类型的验证

Java Spring 3.2泛型类型的验证,java,spring,validation,spring-mvc,generics,Java,Spring,Validation,Spring Mvc,Generics,我有一个界面,如下所示: @Validated public interface Service<T extends Foo, N extends Bar> { @Valid @NotNull T doStuff(@Valid N bar); } 最后,我基本上有一个实现PhoneService的控制器,例如: @Controller public final class PhoneServiceController implements PhoneServ

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

@Validated
public interface Service<T extends Foo, N extends Bar> {
    @Valid
    @NotNull
    T doStuff(@Valid N bar);
}
最后,我基本上有一个实现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不知道如何处理有效的N条。还是我错了?

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

@请参见

您是如何实例化/访问它们的?我编辑了这个问题,以说明我如何使用我的对象。您能让它工作吗?
@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();
}
@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;
}