2014-03-13 3 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입니다. processAddThing()의 구현은 위의 예에서 올바르지 않습니다 :

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

} 

당신은 문제가 무엇인지를 참조하십시오. 인터페이스 사양에 따라 Thing 클래스를 모델로 검증해야합니다. 하지만 @Valid을 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){