另一种解决方案(适用于弹簧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,所以你需要在被覆盖的'write'方法中测试对象类型,或者让MyPojoWrapper处理它。
也许是相关的:http://stackoverflow.com/questions/6014784/serialize-specific-exceptions-with-spring-mvc – Bozho 2011-05-16 10:33:24