如何让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的属性:
- 创建自定义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; } }
- 在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
相关产品推荐
相关产品推荐

