【发布时间】: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