package com.myhexin.vtuber.reqresp.globalhandler; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.PropertyNamingStrategy; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SerializerFeature; import lombok.extern.slf4j.Slf4j; import org.springframework.core.MethodParameter; import org.springframework.core.annotation.Order; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.lang.Nullable; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import java.util.Objects; /** * ResponseCamelcaseToUnderlineAdvice * 将结果转为下划线命名 * * @author lufeng@myhexin.com * @date 2023/2/3 **/ @Slf4j @Order ( 10000 ) @ControllerAdvice public class ResponseCamelcaseToUnderlineAdvice implements ResponseBodyAdvice<Object> { @Override public boolean supports( MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { return AbstractJackson2HttpMessageConverter. class .isAssignableFrom(converterType); } @Override public Object beforeBodyWrite( @Nullable Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if (Objects.nonNull(body)) { return objectToUnderline(body); } else { return body; } } /** * 对象转下划线 * * @param obj obj * @return object */ public static Object objectToUnderline(Object obj) { String json = objectToUnderlineJson(obj); return JSON.parse(json); } /** * 对象转下划线 * * @param obj obj * @return object */ public static String objectToUnderlineJson(Object obj) { if (obj == null ) { return null ; } SerializeConfig config = new SerializeConfig(); config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase; return serialize(obj, config); } /** * 序列化(保留null值) * * @param obj obj * @param config config * @return str */ private static String serialize(Object obj, SerializeConfig config) { return JSON.toJSONString( obj, config, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue ); } } |