Spring MVC 返回 JSONS 和异常处理

Posted

技术标签:

【中文标题】Spring MVC 返回 JSONS 和异常处理【英文标题】:Spring MVC returning JSONS and exception Handling 【发布时间】:2011-07-20 16:40:40 【问题描述】:

我正在将 Spring MVC 与控制器一起使用,我的问题是如何返回与返回的 @ResponseBody 对象不同的 JSON 响应,该对象返回并转换为要返回的 JSON。

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

@ResponseBody UserDetails

现在返回的 json 看起来像

name : "TheUsersName", 电子邮件地址:“abc@abc123.com”

有什么方法可以在返回之前修改 json(所有控制器的所有方法中的所有 json),其中将添加“状态”字段,其他 json 数据将位于 json 中的“数据”键下。

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

【问题讨论】:

可能相关:***.com/questions/6014784/… 【参考方案1】:

另一种解决方案(适用于 spring 3.1),侵入性较小

在你的 spring 配置中:

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

【讨论】:

【参考方案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;

要添加异常,您可以使用相同的方式使用 key 和 success = false。

【讨论】:

我看不到 ModelAndView 在这里添加了什么值。为什么不直接返回ModelMap 我不确定我为什么要使用 ModelAndView 但是你给了我使用地图 (HashMap) 的想法,它就像一个魅力并给了我想要的输出。但是,在失败的情况下我该如何做呢?但是,对于所有控制器和控制器中的所有功能,有什么方法可以集中处理吗? @skaffman 你是对的。大脑也会从返回视图中放屁。 @milindaD ModelMap 不需要键,但差别不大。它实现了地图。【参考方案3】:

创建响应类:

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

【讨论】:

查看此主题以获得更详细的答案:***.com/questions/5641091/…

以上是关于Spring MVC 返回 JSONS 和异常处理的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC全局异常后返回JSON异常数据

spring mvc怎么处理返回值

如何使用 MVC 的内容协商在 ASP.NET Core MVC 中间件中返回响应?

spring mvc 异常如何处理

使用Spring MVC统一异常处理实战

Spring MVC异常处理