使用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
相关产品推荐
相关产品推荐

