2014-11-19 2 views
0

사용자 정의 객체/인터페이스 구현을 내 컨트롤러에 바인드하고 싶습니다.타입 매개 변수가있는 SpringFramework 사용자 정의 바인딩

class Form{ 
    private Action action; 
    // setter/getter 
} 

interface Action{} 

class Action1 implements Action{} 

class Action2 implements Action{} 


@Controller 
class ActionController{ 
    @RequestMapping("/") 
    public String action(Form form){ 
     form.getAction(); // this should be an instance of Action1 or Action2 
    } 
} 

Action1 또는 Action2인지 확인하려면 HTML 양식에 형식 매개 변수를 추가하고 싶습니다.

<input name="form.action.type" value="1" /> 

이미 사용 가능한 것과 같은 것이 있거나이를 구현하는 방법을 알고있는 사람이 있습니까?

PropertyEditors를 이미 살펴 봤지만, 내가 말할 수있는 한 하나의 필드 만 문자열로 가져오고 다른 속성에는 액세스 할 수없는 것 같습니다. 가능하면 자신 만의 HandlerMethodArgumentResolver를 만드는 것보다 쉬운 방법을 찾고 있습니다.

+0

귀하의 요구 사항을 충족시키는 확실한 방법이 있습니다. 그러나 폼에 포함 된 다른 필드와 액션이 무엇인지 알지 못하면 PropertyEditor와 Converter를보다 자세히 알려주기가 어렵습니다. –

+0

폼과 액션 객체는 많은 속성을가집니다. Action1은 모든 속성 (유형 제외)에서 Action2와 다릅니다. Action1 또는 Action2에는 유형 필드가있는 Object가 더 많이 포함될 수도 있습니다. – cin

답변

1

정확하게 수행 할 수 없습니다. 컨트롤러가 ModelAttribute 매개 변수를 선언하면 Spring은 먼저 빈 객체를 생성하고 매개 변수 또는 하위 객체의 매개 변수를 설정합니다. 따라서 form.action.type 매개 변수를 분석하기 전에 Action 객체를 만들어야합니다.

모든 양식 매개 변수를 직접 수용 할 수있는 기본값 인 Action 구현을 사용하는 한 가지 방법이 있습니다. 그런 다음 getter는 적절한 Action 유형을 생성합니다.

private class ActionDefault { 
    // parameters and setters to store all form fields at appropriate level 
} 

class Form { 
    Action action = null; 
    ActionDefault actionDefault = new ActionDefault(); 

    Action getAction() { 
     if (action == null) { 
      // generates proper Action object and affects it to action 
     } 
     return action; 
    } 
    // getter and setter for actionDefault; 
} 
관련 문제