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

SpringBoot中使用RestTemplate发送XML请求时如何禁用编码?

在SpringBoot中用RestTemplate发送XML请求时禁用编码处理

你当前设置的DefaultUriBuilderFactory.EncodingMode.NONE只对URI路径/参数的编码生效,请求体里的XML序列化编码是由对应的HttpMessageConverter控制的,所以才会出现&被转成&的双重编码问题。要禁用请求体的XML字符转义,得从消息转换器入手,以下是三种可行方案:

方案一:自定义Jackson XML消息转换器(依赖Jackson处理XML时)

如果项目引入了jackson-dataformat-xml,可以通过配置XmlMapper直接禁用特殊字符转义:

// 构建自定义XmlMapper,关闭XML转义特性
XmlMapper xmlMapper = XmlMapper.builder()
        .disable(ToXmlGenerator.Feature.ESCAPE_XML)
        .disable(ToXmlGenerator.Feature.ESCAPE_NON_ASCII)
        .build();

// 创建自定义消息转换器并指定支持的媒体类型
MappingJackson2XmlHttpMessageConverter xmlConverter = new MappingJackson2XmlHttpMessageConverter(xmlMapper);
xmlConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.TEXT_XML));

// 替换RestTemplate中原有的Jackson XML转换器
restTemplate.getMessageConverters().removeIf(converter -> converter instanceof MappingJackson2XmlHttpMessageConverter);
restTemplate.getMessageConverters().add(xmlConverter);

方案二:自定义JAXB消息转换器(用JAXB默认序列化时)

如果实体类使用@XmlRootElement等JAXB注解序列化,可以修改Marshaller的属性来禁用字符转义:

Jaxb2RootElementHttpMessageConverter jaxbConverter = new Jaxb2RootElementHttpMessageConverter() {
    @Override
    protected void customizeMarshaller(Marshaller marshaller) {
        super.customizeMarshaller(marshaller);
        // 设置自定义字符处理器,直接输出原始字符
        marshaller.setProperty("com.sun.xml.bind.marshaller.CharacterEscapeHandler",
                (ch, start, length, isAttVal, writer) -> writer.write(ch, start, length));
        marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
    }
};

jaxbConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.TEXT_XML));

// 替换RestTemplate中原有的JAXB转换器
restTemplate.getMessageConverters().removeIf(converter -> converter instanceof Jaxb2RootElementHttpMessageConverter);
restTemplate.getMessageConverters().add(jaxbConverter);

方案三:直接发送预生成的XML字符串(最直接)

如果可以提前生成不带转义的XML字符串,直接用StringHttpMessageConverter发送,绕开框架的自动编码逻辑:

// 手动构造符合要求的XML内容
String rawXml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" +
        "<ud type=\"text\">HELLOOOO YEYEYE🥺🥺©À¥¥didi🥺wawa©yayuÀ</ud>";

HttpHeaders headers = new HttpHeaders();
headers.setAccept(Collections.singletonList(MediaType.TEXT_XML));
headers.setContentType(MediaType.TEXT_XML);
HttpEntity<String> httpEntity = new HttpEntity<>(rawXml, headers);

ResponseEntity<String> responseEntity = restTemplate.postForEntity(uriComponentsBuilder.toUriString(), httpEntity, String.class);

注意:直接发送未转义XML时,要确保内容本身符合XML规范(比如不能包含未转义的<、>等字符,你的示例中的表情和特殊字符属于UTF-8合法字符,无需转义)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 01:42:11