2011-01-04 2 views
2

예를 들어 요청이 성공하면 View를 반환하고, 그렇지 않으면 오류 메시지를 나타내는 String을 반환하고 content-type을 xml 또는 json으로 설정합니다. JavaScript XHR 콜백 메소드는 다른 페이지 (보기)로 리디렉션하거나 동일한 페이지에 머무르면서 오류 정보를 표시하는 작업을 수행합니다.Spring MVC에서는 하나의 요청 처리 메소드에서 다른 리턴 타입을 사용할 수 있습니까?

내가 읽은 것을 바탕으로 처리기 메서드의 반환 형식으로 "void"를 사용해야하는 것처럼 보입니다. 체크 아웃 : "메소드가 응답 내용을 직접 처리하거나 (그 용도로 ServletResponse/HttpServletResponse 유형의 인수를 선언하여) 응답을 직접 처리하거나, 뷰의 이름이 RequestToViewNameTranslator를 통해 암시 적으로 결정된 경우 ( 핸들러 메소드 서명에서 응답 인수를 선언하지 않음). "(Spring Framework 참조). 내가 이해 해달라고 무엇

수단 "보기 이름이 암시 (핸들러 메소드 서명에 응답 인수를 선언하지 )를 RequestToViewNameTranslator을 통해 결정하도록되어"무엇인가? 아무도 내게 모범을 보이지 않니? 당신의 특별한 경우

답변

6

클리너 솔루션은 일반 컨트롤러 메소드가 오류가 발생하면 예외를 throw 한 다음 @ExceptionHandler 메쏘드를 가져 와서 오류 응답을 반환하는 것입니다.

@RequestMapping("/") 
public View requestHandler() throws SomeException 
{ 
    // ... 
} 

@ExceptionHandler(SomeException.class) 
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 
public @ResponseBody String handleSomeException(SomeExcption ex) 
{ 
    return ex.getMessage(); // for example 
} 

출력 JSON에 직접 HttpServletResponse에 액세스 할 필요성을 제거합니다 @ResponseBody와 함께 사용되는 MappingJacksonHttpMessageConverter

. 또는 MappingJacksonJsonViewModel을 사용하십시오. XML 변환기/뷰를 사용하여 동일한 작업을 수행 할 수 있습니다.

RequestToViewNameTranslator은 다른보기 이름이 지정되지 않은 경우 요청을보기 이름으로 변환합니다 (추측 하듯이). 예를 들어 DefaultRequestToViewNameTranslator을 참조하십시오.

+0

감사합니다. OrangeDog 및 Ralph. 그게 내 문제를 해결해 줬어! – Bobo

+0

다른 질문이 하나 더 있습니다. MVC 전문가 : 예외 결과에 따라 몇 가지 경우가 있습니다. 동일한 페이지에 머물러 정보를 사용자에게 표시하거나 다른 페이지로 리디렉션해야합니다. 결과가 ABC이고 ResultABCException을 던지면 말할 수 있다고 생각하지만이 경우에는 바람직하지 않습니다. 이것에 대한 당신의 제안은 무엇입니까? 감사. – Bobo

+0

@Bobo - 왜 'ErrorMessageException'과'RedirectException' 둘 다 갖는 것이 바람직하지 않습니까? 예외의 일부 속성에 따라 HttpServletResponse를 예외 처리기에서 직접 처리하도록 할 수도 있습니다. 또는 기본 처리기에서 반환 할 수있는 다른보기로 리디렉션을 구현하십시오. – OrangeDog

2

은 :

  • everyting 괜찮 경우

    - 후 정상 (JSP)보기 오류가 occures 경우
  • 을 반환 -

내가 할 것 다음 오류 페이지를 인쇄 더 일반적인 방법으로 : 요청 처리기 메서드는보기 이름이나 모델 및보기를 "반환"합니다. 그리고 오류가 있으면 요청 처리기 메서드가 예외를 throw합니다. Spring은 특수 뷰 핸들러 인 예외를 처리하는 기능을 제공합니다.

0

"뷰 이름은 처리기 메서드 서명에서 응답 인수를 선언하지 않고 RequestToViewNameTranslator를 통해 암시 적으로 결정되는 것으로 가정합니다"는 의미입니다. 스프링 MVC에 대한 excelent 기사에서

인용구 :

한 가지 흥미로운 경우이 방법은 뷰를 지정하지 않을 때 일어나는 것이다 (예를 들어, 반환 유형은 무효가됩니다). 이 경우 규약에서는 DispatcherServlet이 요청 URI의 경로 정보를 다시 사용하여 선행 슬래시와 확장자를 제거합니다. [...]이 요청 처리 방법과 "/ accounts/show"의 요청 매핑이 주어지면 DispatcherServlet이 "accounts/show"의 기본보기 이름으로 돌아갈 것을 기대할 수 있습니다.

또한 예를 제시합니다. http://www.infoq.com/articles/spring-2.5-ii-spring-mvc, "유연한 요청 처리 메소드 서명"장 참조

관련 문제