无对应Java类时如何遍历打印Logger中XML对象响应数据
解决方案:打印无toString()的XML对象数据
方案1:通过反射手动提取字段值
针对没有自定义toString()的对象,可以用反射遍历其字段并提取值,写一个通用工具方法即可复用:
import java.lang.reflect.Field; public class ObjectPrinter { public static String printObject(Object obj) { if (obj == null) { return "null"; } StringBuilder sb = new StringBuilder(); Class<?> clazz = obj.getClass(); sb.append(clazz.getSimpleName()).append(" ["); Field[] fields = clazz.getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); try { sb.append(field.getName()).append("=").append(field.get(obj)).append(", "); } catch (IllegalAccessException e) { sb.append(field.getName()).append("=无法访问, "); } } if (sb.length() > 2) { sb.delete(sb.length() - 2, sb.length()); } sb.append("]"); return sb.toString(); } }
在你的业务代码中调用:
detailsResp.getAccountNumberList().stream().forEach(item -> logDebug("print getAccountNumberList value---" + ObjectPrinter.printObject(item)) );
方案2:将XML对象转回XML字符串打印
如果这些对象是通过JAXB等XML绑定框架生成的,直接把对象重新序列化为XML字符串,就能完整还原原始结构:
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import java.io.StringWriter; public class XmlConverter { public static String toXml(Object obj) { if (obj == null) { return "null"; } try { JAXBContext context = JAXBContext.newInstance(obj.getClass()); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); StringWriter writer = new StringWriter(); marshaller.marshal(obj, writer); return writer.toString(); } catch (JAXBException e) { return obj.getClass().getName() + " 转XML失败: " + e.getMessage(); } } }
调用示例:
detailsResp.getAccountNumberList().stream().forEach(item -> logDebug("print getAccountNumberList value---\n" + XmlConverter.toXml(item)) );
方案3:使用第三方工具简化属性获取
不想自己写反射代码的话,可以用Apache Commons BeanUtils直接读取对象属性:
先引入Maven依赖:
<dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.4</version> </dependency>
然后在代码中提取指定属性打印:
import org.apache.commons.beanutils.BeanUtils; // ... detailsResp.getAccountNumberList().stream().forEach(item -> { try { logDebug("print getAccountNumberList value---accountNumber=" + BeanUtils.getProperty(item, "accountNumber") + ", accountType=" + BeanUtils.getProperty(item, "accountType")); } catch (Exception e) { logDebug("获取属性失败: " + e.getMessage()); } });
内容的提问来源于stack exchange,提问作者Ashok Ravipalli
相关产品推荐
相关产品推荐

