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;
}