diff --git a/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewResponseProcessor.java b/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewResponseProcessor.java index 2d7d97e..c9ea212 100644 --- a/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewResponseProcessor.java +++ b/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewResponseProcessor.java @@ -1,12 +1,13 @@ package com.monitorjbl.json; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.accept.ContentNegotiationManager; import org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor; import java.util.List; public class JsonViewResponseProcessor extends RequestResponseBodyMethodProcessor { - public JsonViewResponseProcessor(List> messageConverters) { - super(messageConverters); + public JsonViewResponseProcessor(List> messageConverters, List responseBodyAdvice) { + super(messageConverters, null, responseBodyAdvice); } } diff --git a/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewReturnValueHandler.java b/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewReturnValueHandler.java index 601e375..3bd68cc 100644 --- a/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewReturnValueHandler.java +++ b/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewReturnValueHandler.java @@ -16,8 +16,8 @@ public class JsonViewReturnValueHandler implements HandlerMethodReturnValueHandl private final HandlerMethodReturnValueHandler delegate; private final DefaultView defaultView; - public JsonViewReturnValueHandler(List> converters, DefaultView defaultView) { - this.delegate = new JsonViewResponseProcessor(converters); + public JsonViewReturnValueHandler(HandlerMethodReturnValueHandler delegate, DefaultView defaultView) { + this.delegate = delegate; this.defaultView = defaultView; } diff --git a/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewSupportFactoryBean.java b/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewSupportFactoryBean.java index 7e08452..31b517c 100644 --- a/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewSupportFactoryBean.java +++ b/spring-json-view/src/main/java/com/monitorjbl/json/JsonViewSupportFactoryBean.java @@ -1,5 +1,6 @@ package com.monitorjbl.json; +import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -80,13 +81,33 @@ private void decorateHandlers(List handlers) { int index = handlers.indexOf(handler); if(handler instanceof HttpEntityMethodProcessor) { handlers.set(index, new JsonViewHttpEntityMethodProcessor(converters)); - } else if(handler instanceof RequestResponseBodyMethodProcessor) { - handlers.set(index, new JsonViewReturnValueHandler(converters, defaultView)); + } else if(handler instanceof HandlerMethodReturnValueHandler) { + HandlerMethodReturnValueHandler valueHandler = handlers.get(index); + List responseBodyAdvice = (List) get(valueHandler,"advice"); + HandlerMethodReturnValueHandler delegate = new JsonViewResponseProcessor(converters, responseBodyAdvice); + handlers.set(index, new JsonViewReturnValueHandler(delegate, defaultView)); break; } } } + //reflection unfortunately + public static Object get(Object obj, String fieldName) { + Class clazz = obj.getClass(); + while (clazz != null) { + try { + Field field = clazz.getDeclaredField(fieldName); + field.setAccessible(true); + return field.get(obj); + } catch (NoSuchFieldException e) { + clazz = clazz.getSuperclass(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + return null; + } + /** * Registering custom serializer allows to the JSonView to deal with custom serializations for certains field types.