2010-12-09 4 views
2

그래서 Spring 애플 리케이션에서 뷰와 콘텐트 협상을 처리하는 방법을 결정해야한다. 이전에는 엔드 포인트에서 특정 컨텐츠 유형 하나만 지원했습니다.Spring MVC에서 다중 컨텐트 타입을 다루는 접근 방식이 선호 되는가?

나는 우리의 세 가지 접근 방식에 대해 생각하는 것을 던질 것입니다.

내 질문 : 어느 것이 일반적으로 가장 좋은 방법으로 간주 되는가? 우리는 필요에 따라 융통성을 제공해야 할 필요가있는 곳에서 부러 질 수있는 우리의 응용 프로그램을 따르는 확고한 국제 대회를 목표로하고 있습니다.

첫 번째 방법 :
사용에 ContentNegotiatingViewResolver. 이것은 서블릿 파일에 정의 된 매핑을 포함합니다 ... 컨트롤러에서 각 컨트롤러 동작은 일부 마법 문자열을 사용하여 맵에서 객체를 명시 적으로 설정해야합니다.

@RequestMapping(value = "/someMapping/source", method = RequestMethod.GET) 
public String foo(Model model) 
{ 
    // more stuff here 
    model.addAttribute(SOME_MODEL_KEY, new ArrayList<String>() { "hello world"}); 

    return "someDummyJsonString"; 
} 

단점 : 컨트롤러의 동작은 일종의 다음과 같이 ... 템플릿 이름을 참조하는 문자열을 반환
보기 리졸버가 조금 무거워 보인다 ... 그들은 우선 순위를 가지고, 당신이 필요 빈번히 시간을 오버라이드 할 수도 있습니다. 또한 템플릿/뷰 Bean 이름을 참조하는 데 사용되는 "magic strings"에 대한 아이디어를 좋아하지 않습니다.

두 번째 방법 :
나는이 봄 3.0에서 새로운 생각하지만, RequestMapping에 당신은 ... 헤더에 일치시킬 수 있습니다 그래서 당신과 같이 수락 헤더에 일치시킬 수 있습니다 :

@RequestMapping(value="/someMapping", method = RequestMethod.GET, headers="Accept=application/json") 
public @ResponseBody SomeBar foo() 
{ 
    // call common controller code here 
    return buildBar(); 
} 

@RequestMapping(value="/someMapping", method = RequestMethod.GET, headers="Accept=text/xml") 
public String foo(Model model) 
{ 
    model.addAttribute("someModelName", this.buildBar()); 
    return "someTemplateNameProcessedByViewResolver"; 
} 

SomeBar buildBar() 
{ 
    return new SomeBar(); 
} 

단점 :
충분히 유연하지 않을 수 있습니까? 확실하지는 않지만, 내가 실제로 headers 접근법을 좋아한다고 생각합니다 ... 다른 프레임 워크 (RESTLet, Rails)가 비슷한 것을 사용하는 것을 보았습니다.

세 번째 방법 :
이 세 번째 접근법은 Accept 헤더에 따라 내용을 협상하고, 적절한 방법을 통해 모델을 던질 것이다 사용자 정의 View을 포함한다. 뷰가이 경우에 너무 많이하고있는 것 같다
... 전망은 다음과 같습니다 단점이 콘텐츠 협상보기는 템플릿 등 :

@RequestMapping(value="/someMapping", method = RequestMethod.GET, headers="Accept=text/xml") 
public View foo() 
{ 
    SomeBar bar = new SomeBar(); 
    ContentNegotiatingView view = new ContentNegotiatingView(bar, "templateName"); 

    return return view; 
} 

을 템플릿을 알고 있고,로드합니다 헤더를보고, 응답 본문 자체를 설정하는 것입니다. http 상태도 설정해야 할 수도 있습니다.

글의 벽을 죄송합니다. 이에 대한 의견을 보내주십시오. 감사합니다

답변

2

누군가 다른 사람 asked this. my answer을 참조하십시오.

+0

그래서 헤더 주석 접근 방식보다보기 해석기 접근 방식을 선호합니까? – Polaris878

+0

뷰 리졸버 접근법은 좀 더 유연 해 보입니다 ... 어쨌든 필자의 문서 읽기에 기반한 Spring 권장 접근 방식 인 것 같습니다. – Todd

+0

흠, 어쩌면 몇 년 후 우리는 아마도 XML 구성 파일 솔루션에 대한 주석 솔루션을 고려할 것입니다. :) –

관련 문제