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 使用MethodValidationPostProcessor进行Spring验证_Java_Spring_Validation - Fatal编程技术网

Java 使用MethodValidationPostProcessor进行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

我正在尝试使用Spring的
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;
  }
}