Ada*_*dam 5 java validation spring
我正在尝试MethodValidationPostProcessor在我的服务层上使用 Spring进行验证。我曾计划创建一个通用服务接口并让控制器按类型注入正确的服务:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个通用的服务定义和一个简单的实现:
public interface Service<T> {
public T execute(@Valid T item);
}
// example implementation:
@Named
@Validated
public class ItemService implements Service<Item>{
@Override
public Item execute(@Valid Item item) {
return item;
}
}
Run Code Online (Sandbox Code Playgroud)
然后设置我的应用程序以包含 SpringsMethodValidationPostProcessor来处理@Validatedbean:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main( String[] args ){
SpringApplication application = new SpringApplication(Application.class);
application.run(args);
}
@Bean
public MethodValidationPostProcessor getMethodValidationPostProcessor(){
MethodValidationPostProcessor processor = new MethodValidationPostProcessor();
processor.setValidator(this.validator());
return processor;
}
@Bean
public LocalValidatorFactoryBean validator(){
return new LocalValidatorFactoryBean();
}
}
Run Code Online (Sandbox Code Playgroud)
此设置会产生以下异常:
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)
Run Code Online (Sandbox Code Playgroud)
我很确定这是由于正在传递给验证器的代理,但我似乎无法解决这个问题。我确定这必须起作用(因为我确定弹簧人已经想到了这一点)并且我只是遗漏了一些东西......任何帮助将不胜感激。
更新:
所以我发现 ifService<T>是一个抽象类而不是接口,一切正常。同样,如果我离开Service<T>接口,只需向方法添加另一个参数,即:execute(String dummy, @Valid T value)这也会导致验证按预期工作。我开始认为这是一个错误......
@Valid从实现中删除ItemService。通常仅在接口级别需要它。您的代码应如下所示。
// example implementation:
@Named
@Validated
public class ItemService implements Service<Item>{
@Override
public Item execute(Item item) {
return item;
}
}
Run Code Online (Sandbox Code Playgroud)