2014-09-22 379 views
4

我試圖使用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 ...

回答

0

刪除@ValidItemService執行。通常它只在接口級別需要。你的代碼應該看起來像下面的代碼。

// example implementation: 
@Named 
@Validated 
public class ItemService implements Service<Item>{ 

    @Override 
    public Item execute(Item item) { 
    return item; 
    } 
} 
+0

真的很抱歉,但您有一個工作的例子嗎?我嘗試了一段時間(當我看到您的回覆時重試),這給了我同樣的問題。 – Adam 2014-09-23 04:10:35