我正在使用带控制器的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”和异常名称(至少是状态部分)
答案 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处理它。