我試圖使用Spring的MethodValidationPostProcessor
驗證服務層。我曾計劃建立一個通用的服務接口,讓控制器按類型注入合適的服務:使用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);
}
}
我有一個通用的服務定義和一個簡單的實現:
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;
}
}
然後設置我的應用程序包括溫泉MethodValidationPostProcessor
處理@Validated
豆:
@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();
}
}
這種設置會產生以下異常:
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)
我敢肯定,這是由於正在傳遞給驗證程序的代理,但我似乎無法找到這個。我敢肯定,這必須工作(正如我敢肯定,春天的傢伙已經想到了這一點),我只是失去了一些東西......任何幫助將不勝感激。
UPDATE:
所以我發現,如果Service<T>
是一個抽象類,而不是一個界面一切正常。同樣,如果我將Service<T>
作爲接口離開,只需在該方法中添加另一個參數即:execute(String dummy, @Valid T value)
這也會導致驗證按預期工作。我開始認爲這是一個bug ...
真的很抱歉,但您有一個工作的例子嗎?我嘗試了一段時間(當我看到您的回覆時重試),這給了我同樣的問題。 – Adam 2014-09-23 04:10:35