2011-03-22 6 views
7

컨트롤러와 함께 Spring MVC를 사용하고 있습니다. 반환되는 JSON에 반환되고 변환 된 @ResponseBody 객체와 다른 JSON 응답을 어떻게 반환합니까?JSONS를 반환하는 Spring MVC 및 예외 처리

더 자세히 설명하기 위해, 나는 이제 개체

@ResponseBody UserDetails 

반환 된 JSON은

{이름처럼 보일 것 "이름", "EMAILADDRESS"라는 두 개의 필드가 "된 UserDetails"라고했다 "TheUsersName" EMAILADDRESS "[email protected]"}

내가 돌아 오기 전에 JSON을 수정할 수있는 방법 (A 있는가 "상태"필드가 추가되고 다른 json 데이터는 json의 "데이터"키 아래에있게되는 모든 컨트롤러의 모든 메소드에있는 jsons입니다. 및 예외 이름 (이상이어야 상태 부분하지만)

+0

아마도 관련 : http://stackoverflow.com/questions/6014784/serialize-specific-exceptions-with-spring-mvc – Bozho

답변

2

예 :

또한 어딘가에서 자바 서버에서 예외가 발생했을 때의 프론트 엔드에 JSON을 반환 어떻게, json으로는 "잘못된 상태"가 있어야합니다. 대신 모델과 뷰를 반환하십시오.

public ModelMap getUserDetails() { 
    UserDetails userDetails; // get this object from somewhere 
    ModelMap map = new ModelMap()(; 
    map.addAttribute("data", userDetails); 
    map.addAttribute("success", true); 
    return map; 
} 

예외를 추가하려면 키와 success = false를 사용하여 예외를 추가하십시오.

public class BadStatus { 
    String errorMessage; 
    boolean status = false; 

    public BadStatus(String msg) { errorMessage = msg; } 
} 

@ExceptionHandler(Exception.class) 
public BadStatus handleException(Exception ex, HttpServletRequest request) { 
    return new BadStatus(ex.getMessage()); 
} 
+0

여기에'ModelAndView'가 추가하는 값이 없습니다. 왜 그냥'ModelMap'을 돌려주지 않는가? – skaffman

+0

저는 ModelAndView를 사용하고자하는 이유가 확실하지 않지만 매력처럼 작동하는 맵 (HashMap)을 사용하고 나에게 원하는 출력을 주겠다는 아이디어를주었습니다. 그러나 실패 시나리오에서 어떻게 동일한 작업을 수행합니까? 그러나 모든 컨트롤러와 컨트롤러의 모든 기능에 대해 중앙 집중화하는 방법에 대한 아이디어가 있습니까? – MilindaD

+0

@skaffman 네 말이 맞아. 두뇌 방귀도보기를 반환에서. @milindaD ModelMap은 키를 필요로하지 않지만 크게 다르지 않습니다. 지도를 구현합니다. –

14

응답 클래스를 만듭니다 대체 솔루션 (스프링 3.1과 함께 작동)은 덜 침략적입니다.

귀하의 봄 설정에서

는 :

<bean id="jacksonConverter"  class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /> 
<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="mypackage.MyMessageConverter" 
      p:delegate-ref="jacksonConverter"> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

아이디어는 자신의 HttpMessageConverter를 제공하는 것입니다 제공된 잭슨 변환기에 위임한다.

public class MyMessageConverter implements HttpMessageConverter<Object> { 
// setters and delegating overrides ommitted for brevity 
@Override 
    public void write(Object t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, 
      HttpMessageNotWritableException { 
// t is whatever your @ResponseBody annotated methods return 
     MyPojoWrapper response = new MyPojoWrapper(t); 

     delegate.write(response, contentType, outputMessage); 
    } 
} 

이렇게하면 모든 pojos가 사용자가 제공하는 다른 json으로 포장됩니다.

예외의 경우 ericacm에서 제안한 해결 방법은 @ResponseBody를 사용하여 'BadStatus'반환 유형에 주석을다는 가장 간단한 방법입니다.

경고 : json으로 serialize 된 BadStatus도 MyMessageConverter를 거치므로 재정의 된 'write'메소드에서 객체 유형을 테스트하거나 MyPojoWrapper가 처리하도록해야합니다.

+0

자세한 답변은이 스레드를 참조하십시오. http://stackoverflow.com/questions/5641091/spring-3-exception-handling-using-json – Sydney

2

: 당신은 같은 객체를 반환 할 것을 제외하고 들어

@ResponseBody public Response getUserDetails) { 
    //... 
    return new Response(userDetails); 
} 

:

public class Response<T> { 
    T data; 
    boolean status = true; 

    public Response(T d) { data = d; } 
} 

이 그런 다음 컨트롤러에서 해당를 반환 :