java springboot controller 方法返回内容过滤

下面是一个例子,对当前项目返回的 BigDecimal 类型进行格式化,前提是返回的类型要么是单个实体,要么是可枚举的实体,如果是 Map 或 其它非自定义实体,可能需要再修改一下代码。

复制代码
@ControllerAdvice
public class MyResponseBodyAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
        if (body != null && body instanceof Result) {
            var result = (Result) body;
            var data = result.getData();
            if (data != null) {
                if (data instanceof BigDecimal)
                    result.setData(ReportController.getInstance().formatBigDecimalScore((BigDecimal) data));
                else
                    formatBigDecimal(data, 0);
            }
        }
        return body;
    }

    public void formatBigDecimal(Object obj, int level) {
        if (obj == null) {
            return;
        }

        var clazz = obj.getClass();

        //System.out.println("formatBigDecimal:" + clazz.getName());

        if (clazz.isArray()) {
            var length = Array.getLength(obj);
            for (int i = 0; i < length; i++) {
                formatBigDecimal(Array.get(obj, i), level + 1);
            }
        } else if (obj instanceof Iterable<?>) {
            var iterable = (Iterable<?>) obj;
            for (Object item : iterable) {
                formatBigDecimal(item, level + 1);
            }
        } else if (clazz.getName().startsWith("net.firstelite.dygl.")) {
            while (clazz != null) {
                var fields = clazz.getDeclaredFields();
                for (var field : fields) {
                    field.setAccessible(true);
                    try {
                        if (field.get(obj) == null)
                            continue;

                        if (field.get(obj).getClass() == BigDecimal.class) {
                            var val = (BigDecimal) field.get(obj);
                            val = ReportController.getInstance().formatBigDecimalScore(val);
                            field.set(obj, val);
                        } else {
                            formatBigDecimal(field.get(obj), level + 1);
                        }
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                }

                clazz = clazz.getSuperclass();
                if (clazz == null || !clazz.getName().startsWith("net.firstelite.dygl."))
                    break;

                //System.out.println("formatBigDecimal:" + clazz.getName());
            }
        } else {
            //do nothing
        }
    }
}
复制代码

 

posted on   空明流光  阅读(378)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2020-03-30 c# 图像压缩
2018-03-30 Eclipse 使用 VS Emulator for android 调试环境配置 步骤
2018-03-30 android ListView 可缩放,支持左右上下手势
2017-03-30 asp.net Checkbox 绑定自定义属性

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示