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 和异常处理的主要内容,如果未能解决你的问题,请参考以下文章