Альтернативное решение (работает с пружиной 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, который делегирует предоставленныйконвертер Джексона.
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, является самым простым способом (помнитечтобы аннотировать возвращаемый тип 'BadStatus' с помощью @ResponseBody).
Предупреждение: ваш сериализированный json BadStatus также проходит через MyMessageConverter, поэтому вы захотите проверить тип объекта в переопределенном методе "write",или MyPojoWrapper справится с этим.