You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:33:38