2014-03-13 32 views
0

我有以下的抽象模型類春 - 混凝土模型的驗證,同時使用界面

public abstract class Thing { 
    private String id; 
    private String name; 
    ... 
} 

3種模型類進行了擴展。我們稱他們爲搖滾,紙,剪刀。例如與紙:

public class Paper extends Thing { 
    private String paperFormat; 
    ... 
} 

我現在有以下CRUD相關的接口來實現:

public interface ThingOperations { 
    public String addThingForm(); 
    public String processAddThing(Thing thing, BindingResult result); 
    ... 
} 

這裏,processAddThing()就是處理一個表單模型(addThingForm()初始化形式)。 現在讓我們來說說我想創建一個與每個具體類相關的控制器(RockController,PaperController和ScissorController)。 以PaperController爲例。

public class PaperController implements ThingOperations { 
    ... 
    @Override 
    @RequestMapping(value="/processAddPaper", method=RequestMethod.POST) 
    public String processAddThing(@Valid Paper newPaper, BindingResult result){ 
     ... 
    } 
... 

} 

你看到的問題是什麼:的processAddThing()執行不上面的例子是正確的。根據接口規格,我應該使用Thing類作爲驗證的模型。但是如果我把@Valid Thing newThing,我將無法將newThing作爲Paper實例,因此我將無法調用相應的Service和DAO Hibernate實現來創建新的Paper記錄。

如果我想在我的3個控制器上成功實現我的界面,並且仍然應用相關的@Valid annotation,您認爲我應該怎麼做?

回答

0

你可以在這裏使用泛型:

public interface ThingOperations<T extends Thing> { 
    public String addThingForm(); 
    public String processAddThing(T thing, BindingResult result); 
    ... 
} 

然後

public class PaperController implements ThingOperations<Paper> { 
    ... 
    @Override 
    @RequestMapping(value="/processAddPaper", method=RequestMethod.POST) 
    public String processAddThing(@Valid Paper newPaper, BindingResult result){