Spring MVC返回JSONS和异常处理

时间:2011-03-22 17:17:33

标签: java json spring spring-mvc exception-handling

我正在使用带控制器的Spring MVC,我的问题是如何返回一个JSON响应,该响应与@ResponseBody对象不同,该对象被返回并包含在要返回的JSON中。

进一步详细说明,我有一个名为“UserDetails”的对象,它有两个名为“name”,“emailAddress”的字段

@ResponseBody UserDetails

现在返回的json看起来像

  

{name:“TheUsersName”,   emailAddress:“abc@abc123.com”}

有没有办法可以在返回之前修改json(所有控制器中所有方法中的所有jsons),其中将添加“status”字段,而其他json数据将位于json中的“data”键下。

当某个地方的java服务器抛出异常时,如何将json返回到前端,json应该有“status:false”和异常名称(至少是状态部分)

3 个答案:

答案 0 :(得分:14)

创建响应类:

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

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

然后从您的控制器返回:

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

对于异常,您需要返回如下对象:

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());
}

答案 1 :(得分:2)

是。改为返回模型和视图。

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以相同的方式执行此操作。

答案 2 :(得分:2)

另一种解决方案(适用于弹簧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,它委托给提供的jackson转换器。

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序列化BadStatus也会通过MyMessageConverter,因此您需要在覆盖'write'方法中测试对象类型,或让MyPojoWrapper处理它。