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 } } }
桂棹兮兰桨,击空明兮溯流光。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源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 绑定自定义属性