Skip to content

Commit

Permalink
attempt to keep responseBodyAdvice intact on handler using reflection…
Browse files Browse the repository at this point in the history
… as the API is really strict

monitorjbl#55
  • Loading branch information
zifnab87 committed Jan 18, 2018
1 parent 2fbd0d0 commit 9122365
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 6 deletions.
@@ -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<HttpMessageConverter<?>> messageConverters) {
super(messageConverters);
public JsonViewResponseProcessor(List<HttpMessageConverter<?>> messageConverters, List<Object> responseBodyAdvice) {
super(messageConverters, null, responseBodyAdvice);
}
}
Expand Up @@ -16,8 +16,8 @@ public class JsonViewReturnValueHandler implements HandlerMethodReturnValueHandl
private final HandlerMethodReturnValueHandler delegate;
private final DefaultView defaultView;

public JsonViewReturnValueHandler(List<HttpMessageConverter<?>> converters, DefaultView defaultView) {
this.delegate = new JsonViewResponseProcessor(converters);
public JsonViewReturnValueHandler(HandlerMethodReturnValueHandler delegate, DefaultView defaultView) {
this.delegate = delegate;
this.defaultView = defaultView;
}

Expand Down
@@ -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;
Expand Down Expand Up @@ -80,13 +81,33 @@ private void decorateHandlers(List<HandlerMethodReturnValueHandler> 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<Object> responseBodyAdvice = (List<Object>) 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.<br>
Expand Down

0 comments on commit 9122365

Please sign in to comment.