Java 使用MethodValidationPostProcessor进行Spring验证
我正在尝试使用Spring的Java 使用MethodValidationPostProcessor进行Spring验证,java,spring,validation,Java,Spring,Validation,我正在尝试使用Spring的MethodValidationPostProcessor对我的服务层进行验证。我曾计划创建一个通用服务接口,并让控制器按类型注入正确的服务: @Controller @RequestMapping("/items") public class ItemController { @Inject // inject a service for the domain type i am controller for private Service<It
MethodValidationPostProcessor
对我的服务层进行验证。我曾计划创建一个通用服务接口,并让控制器按类型注入正确的服务:
@Controller
@RequestMapping("/items")
public class ItemController {
@Inject
// inject a service for the domain type i am controller for
private Service<Item> service;
@RequestMapping(method = RequestMethod.POST, produces="application/json")
public @ResponseBody Item create(@RequestBody Item item){
return this.service.execute(item);
}
}
此设置会产生以下异常:
HV000162: The validated type org.commons.test.validation.ItemService does not specify the constructor/method: public abstract java.lang.Object org.commons.test.validation.Service.execute(java.lang.Object)
我很确定这是由于代理被传递给验证器造成的,但我似乎无法找到解决方法。我相信这一定会奏效(就像我相信春天的小伙子们想到的那样),我只是错过了一些东西。。。任何帮助都将不胜感激
更新:
所以我发现,如果
服务是一个抽象类,而不是一个接口,那么一切都可以工作。同样,如果我将服务
作为一个接口,只需向方法添加另一个参数,即:execute(String dummy,@Valid T value)
这也会导致验证按预期工作。我开始认为这是一个bug…从ItemService
实现中删除@Valid
。通常仅在接口级别需要。您的代码应该如下所示
// example implementation:
@Named
@Validated
public class ItemService implements Service<Item>{
@Override
public Item execute(Item item) {
return item;
}
}
//示例实现:
@命名
@验证
公共类ItemService实现服务{
@凌驾
公共项目执行(项目){
退货项目;
}
}
真的很抱歉,你能举一个有效的例子吗?我前一段时间尝试过这个方法(看到您的响应后重试),这给了我同样的问题。Adam,将@Valid添加到接口公共接口服务{T execute(@Valid T item);}
HV000162: The validated type org.commons.test.validation.ItemService does not specify the constructor/method: public abstract java.lang.Object org.commons.test.validation.Service.execute(java.lang.Object)
// example implementation:
@Named
@Validated
public class ItemService implements Service<Item>{
@Override
public Item execute(Item item) {
return item;
}
}