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

使用Retrofit2与SimpleXmlConverter时,如何将自定义模型转为XML字符串?

解决Retrofit2 + SimpleXmlConverter无法将模型转为XML请求体的问题

嘿,我之前也碰到过完全一样的困扰!其实SimpleXmlConverter本身是支持把自定义模型序列化为XML请求体的,大概率是你的配置或者模型注解没到位,下面给你几个靠谱的解决思路:

1. 检查模型类的SimpleXml注解是否完整正确

SimpleXml对注解的要求比较严格,必须给根类和字段加上对应的注解才能正常序列化。举个例子:

// 根类必须加@Root注解,strict=false可以忽略未知字段
@Root(name = "UserRequest", strict = false)
public class UserRequest {
    // 每个需要序列化的字段加@Element注解指定标签名
    @Element(name = "UserName")
    private String userName;
    
    @Element(name = "UserAge")
    private int userAge;

    // 记得添加无参构造器(SimpleXml序列化需要)
    public UserRequest() {}

    // 带参构造器、getter和setter
    public UserRequest(String userName, int userAge) {
        this.userName = userName;
        this.userAge = userAge;
    }

    // getter/setter...
}

然后在Retrofit接口里直接用@Body传递模型:

@POST("user/submit")
Call<UserResponse> submitUserInfo(@Body UserRequest request);

同时确保你的Retrofit实例已经正确添加了SimpleXmlConverterFactory:

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://your-api-url.com/")
        .addConverterFactory(SimpleXmlConverterFactory.create())
        .build();

2. 确认依赖版本兼容

Retrofit的SimpleXmlConverter和SimpleXml核心库版本要匹配,不然容易出现序列化失败的情况。比如在Gradle里配置:

// Retrofit核心
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
// SimpleXml转换器
implementation 'com.squareup.retrofit2:converter-simplexml:2.9.0'
// SimpleXml核心库(和转换器版本对应)
implementation 'org.simpleframework:simple-xml:2.7.1'

3. 手动序列化模型为XML RequestBody

如果上面的方法都不行,可以用SimpleXml的Serializer手动把模型转成XML字符串,再封装成RequestBody:

先写一个工具类:

public class XmlSerializationHelper {
    private static final Serializer serializer = new Persister();

    public static RequestBody convertToXmlRequestBody(Object model) {
        try {
            // 把模型序列化为XML字符串
            String xmlContent = serializer.write(model);
            // 封装成application/xml类型的RequestBody
            return RequestBody.create(MediaType.parse("application/xml"), xmlContent);
        } catch (Exception e) {
            throw new RuntimeException("序列化模型到XML失败", e);
        }
    }
}

然后修改Retrofit接口:

@POST("user/submit")
Call<UserResponse> submitUserInfo(@Body RequestBody requestBody);

调用的时候这样用:

UserRequest requestModel = new UserRequest("张三", 25);
RequestBody requestBody = XmlSerializationHelper.convertToXmlRequestBody(requestModel);
Call<UserResponse> call = apiService.submitUserInfo(requestBody);

4. 备选方案:换用其他XML序列化库

如果SimpleXml实在不合心意,也可以试试JAXB或者Jackson的XML转换器,但个人觉得SimpleXml已经足够轻量好用,优先排查前面的配置问题更划算。

内容的提问来源于stack exchange,提问作者Mohit Chauhan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:42:32