【问题标题】:Spring MVC returning JSONS and exception HandlingSpring MVC 返回 JSONS 和异常处理
【发布时间】: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”和异常名称(至少是状态部分)

【问题讨论】:

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


【解决方案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());
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2013-08-13
    • 2016-12-30
    • 2015-01-24
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多