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

如何让REST API的XML响应中元素属性值使用单引号?

问题:Jackson XML序列化时将属性引号改为单引号

我的REST API支持返回JSON和XML格式响应,使用Jackson框架处理XML元素序列化。但通过@JacksonXmlProperty(isAttribute = true)注解生成的XML属性值默认用双引号包裹(如lon="9.87"),我需要将其改为单引号(如lon='9.87')。

相关代码示例:

public class Root implements Serializable {
    private double distance;
    @JsonInclude(JsonInclude.Include.NON_DEFAULT)
    private double seca_distance;
    @JacksonXmlElementWrapper (localName = "routepoints")
    @JacksonXmlProperty(localName = "point")
    private List<RoutePoint> routepoints;
    
    // getter和setter方法已省略
}

public class RoutePoint implements Serializable {
    @JacksonXmlProperty(isAttribute = true)
    private double lon;
    @JacksonXmlProperty(isAttribute = true)
    private double lat;
    
    // getter和setter方法已省略
}

当前XML响应示例:

<route>
  <distance>10898.387781160134</distance>
  <seca_distance>674.09075</seca_distance>
  <routepoints>
     <point lon="9.87" lat="53.54"/>
     <point lon="9.87" lat="53.54"/>
  </routepoints>
</route>
解决方案

Jackson XML模块基于StAX API实现序列化,要修改属性引号类型,需配置XMLOutputFactory的属性:

  1. 创建自定义XmlMapper实例,指定使用单引号作为属性包裹符:
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import javax.xml.stream.XMLOutputFactory;

public class CustomXmlMapperProvider {
    public static XmlMapper getCustomXmlMapper() {
        XmlMapper xmlMapper = new XmlMapper();
        XMLOutputFactory outputFactory = xmlMapper.getFactory().getXMLOutputFactory();
        // 设置使用单引号包裹属性值
        outputFactory.setProperty(XMLOutputFactory.PROPERTY_USE_SINGLE_QUOTES, true);
        return xmlMapper;
    }
}
  1. 在API配置中替换默认的XmlMapper(以Spring Boot为例):
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2XmlHttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJackson2XmlHttpMessageConverter) {
                ((MappingJackson2XmlHttpMessageConverter) converter)
                    .setObjectMapper(CustomXmlMapperProvider.getCustomXmlMapper());
            }
        }
    }
}

配置完成后,序列化生成的XML中<point>元素会变为:

<point lon='9.87' lat='53.54'/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:55:27