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

