Refactor CommonResultControllerAdvice

pull/137/head
johnniang 2019-03-21 10:55:11 +08:00
parent fcbb9933ba
commit 2f15a34520
1 changed files with 35 additions and 7 deletions

View File

@ -4,11 +4,15 @@ import cc.ryanc.halo.model.support.BaseResponse;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter;
import org.springframework.http.converter.json.MappingJacksonValue;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.AbstractMappingJacksonResponseBodyAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
/**
* Controller advice for comment result.
@ -16,10 +20,33 @@ import org.springframework.web.servlet.mvc.method.annotation.AbstractMappingJack
* @author johnniang
*/
@ControllerAdvice("cc.ryanc.halo.web.controller")
public class CommonResultControllerAdvice extends AbstractMappingJacksonResponseBodyAdvice {
public class CommonResultControllerAdvice implements ResponseBodyAdvice<Object> {
@Override
protected void beforeBodyWriteInternal(MappingJacksonValue bodyContainer,
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return AbstractJackson2HttpMessageConverter.class.isAssignableFrom(converterType);
}
@Override
@NonNull
public final Object beforeBodyWrite(@Nullable Object body, MethodParameter returnType,
MediaType contentType, Class<? extends HttpMessageConverter<?>> converterType,
ServerHttpRequest request, ServerHttpResponse response) {
MappingJacksonValue container = getOrCreateContainer(body);
// The contain body will never be null
beforeBodyWriteInternal(container, contentType, returnType, request, response);
return container;
}
/**
* Wrap the body in a {@link MappingJacksonValue} value container (for providing
* additional serialization instructions) or simply cast it if already wrapped.
*/
private MappingJacksonValue getOrCreateContainer(Object body) {
return (body instanceof MappingJacksonValue ? (MappingJacksonValue) body : new MappingJacksonValue(body));
}
private void beforeBodyWriteInternal(MappingJacksonValue bodyContainer,
MediaType contentType,
MethodParameter returnType,
ServerHttpRequest request,
@ -39,4 +66,5 @@ public class CommonResultControllerAdvice extends AbstractMappingJacksonResponse
bodyContainer.setValue(baseResponse);
response.setStatusCode(HttpStatus.valueOf(baseResponse.getStatus()));
}
}