CXF客户端乱码

article/2025/9/13 21:58:44

CXF客户端乱码

解决办法一,设置服务端代码:

在使用CXF与其他系统对接时,发现对方系统响应的汉字乱码,使用soapui调用测试就没有问题,但是程序里面调用就乱码,很奇怪,乱码如下:
在这里插入图片描述
由于不知道问题所在,只能在CXF动态调用的客户端代码上加IN 和 OUT拦截器,查看请求和响应,代码如下:

 		//获取cxf客户端JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();Client client = clientFactory.createClient(executeDataUrl);//一个是namespace  一个是调用的方法名 根据你自己的接口填写QName qName = new QName(executeNameSpace, executeDataMethod);String param2 = "10001";String param3 = "测试";//日志拦截器client.getInInterceptors().add(new LoggingInInterceptor());client.getOutInterceptors().add(new LoggingOutInterceptor());Object[] result = client.invoke(qName, token, param2, param3);System.out.println(result[0]);

然后发送,发现日志很清晰,如下:
在这里插入图片描述
发现什么了吗? 兄弟们,返回编码居然是ISO8859-1? 但是对方系统调查后说是返回的就是UTF-8编码,为啥我本地成了ISO-8859-1编码了?
于是我在本地创建了CXF服务端,再次使用客户端调用,发现日志如下:
在这里插入图片描述
发现什么了吗?老铁们,Content-Type: text/xml;charset=UTF-8 这个响应头和他们给我返回的不一样,那是不是必须设置响应头的Content-Type属性的字符集为UTF-8才行呢,于是我使用一个OUT过滤器解决了这个问题(我是springboot项目,其他工程也是一样),
CXF服务端添加OUT过滤器并设置响应头,过滤器代码如下:

package com.npcs.cxf.interceptor;import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.springframework.stereotype.Component;import java.util.*;/*** @author MPF* @date 2021/2/28 17:34* @desc*/@Component
public class ClientAuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> {public ClientAuthInterceptor() {//准备发送阶段  如果不是这个阶段可能会获取不到内容哦 要注意super(Phase.PRE_STREAM);}@Overridepublic void handleMessage(SoapMessage message) throws Fault {Map<String, List<String>> headers =(Map<String, List<String>>)message.get(Message.PROTOCOL_HEADERS);if(headers == null){headers = new TreeMap<String,List< String>>(String.CASE_INSENSITIVE_ORDER);message.put(Message.PROTOCOL_HEADERS,headers);}headers.put("Content-Type", Arrays.asList("text/xml;charset=UTF-8"));}
}

服务端发布应用添加OUT过滤器:

package com.npcs.cxf.config;import com.npcs.cxf.interceptor.ClientAuthInterceptor;
import com.npcs.cxf.service.CxfTestService;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.xml.ws.Endpoint;@Configuration
public class CxfTestConfig {@Autowiredprivate ClientAuthInterceptor clientAuthInterceptor;@Autowiredprivate Bus bus;@Autowiredprivate CxfTestService cxfTestService;@SuppressWarnings("all")@Beanpublic ServletRegistrationBean dispServlet() {return new ServletRegistrationBean(new CXFServlet(), "/soap/*");}/*** JAX-WS* * 站点服务* ***/@Beanpublic Endpoint endpoint() {EndpointImpl endpoint = new EndpointImpl(bus, cxfTestService);endpoint.publish("/test");//添加OUT过滤器   你刚才写的过滤器就在这里添加endpoint.getOutInterceptors().add(clientAuthInterceptor);return endpoint;}
}

这样就可以了,每次响应回来的数据都是UTF-8编码的,客户端不会再乱码了。这里只是拿ISO8859-1做对比,其他环境可能GBK或其他编码,都可以通过设置Content-Type来解决。

注: 我这个只是java代码调用乱码,用soapui或postman调用不会乱码的(他们系统返回的字符集的确是UTF-8),很奇怪,我不知道如果代码不指定字符集,服务器会不会自动加什么,我在本地的测试案例不设置字符集也不乱码,和他们的区别就是我的是tomcat9, 他们的是jetty9。

解决办法二,设置客户端代码:

客户端代码修改同样需要设置拦截器,不过是设置客户端的 IN 拦截器,拦截器代码如下:


import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.springframework.stereotype.Component;/*** @author 小兵* @date 2021/3/1 12:55* @desc CXF客户端  如果服务端的Content-Type没有指定字符集编码,客户端会使用ISO8859-1解析* 会出现乱码情况,此时需要设置一下客户端的解析编码  将非UTF-8的编码转换为UTF-8*/
@Component
public class EncodingInterceptor extends AbstractPhaseInterceptor<SoapMessage> {//指定字符集private static final String ENCODING_DEFAULT = "UTF-8";public EncodingInterceptor() {//准备发送阶段super(Phase.PRE_STREAM);}@Overridepublic void handleMessage(SoapMessage message) throws Fault {//不是UTF-8编码的替换成UTF-8String encoding = (String) message.get(Message.ENCODING);if(!ENCODING_DEFAULT.equals(encoding)){message.put(Message.ENCODING, ENCODING_DEFAULT);}}
}

在客户端代码中添加 IN 拦截器:

  		//获取cxf客户端JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();Client client = clientFactory.createClient(executeDataUrl);QName qName = new QName(executeNameSpace, executeDataMethod);client.getInInterceptors().add(encodingInterceptor );Object[] result = client.invoke(qName, "测试");System.out.println(result[0]);

这样也不会乱码,结果如下:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/6kAuNMEw.shtml

相关文章

SpringBoot集成CXF

CXF入门篇https://blog.csdn.net/tongxin_tongmeng/article/details/126482362Server端项目结构 Server端pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"…

走进cxf

一、什么是cxf 有很多人认为cxf就是webservice&#xff0c;其实cxf只是发布调用webservice的工具而已 Apache CXF Celtix Xfire&#xff0c;开始叫 Apache CeltiXfire&#xff0c;后来更名为 Apache CXF 了&#xff0c;以下简称为 CXF。Apache CXF 是一个开源的 web Service…

NewSQL ---- Mysql.8.0 与 MemSQL 7.0 大数据量查询性能对比

目录 1测试环境以及测试用例设计 1.1测试环境 1.2测试用例设计 2 千万级数据量性能测试对比 2.1 MemSQL时间范围分页查询 2.1.1 性能测试数据 2.2任务信息查询 2.2.1 性能测试数据 2.3 执行批次范围查询 2.3.1 性能测试数据 2.4 批次任务查询 2.4.1 性能测试数据 …

memsql架构2

接上次的MemSQL分布式架构介绍(一)&#xff0c;原文在这里&#xff1a;http://docs.memsql.com/latest/concepts/distributed_architecture/ 首先上张图&#xff0c;是我根据自己的理解画的&#xff0c;如有错误还请大家指出 几个概念 1、MemSQL有两种类型的表&#xff1a; ref…

MemSQL性能测试结果

1.查询的SQL select count(subie.user_id) as count from sum_user_basic_info_exp subie join sum_user_lend_info_exp sulie on sulie.user_idsubie.user_id where subie.curr_user_role_cd1 and subie.reg_dt >2016-08-29 and subie.reg_dt <2016-08-29 结…

【MySQL】SQL优化

SQL优化 1 插入数据 1.1 insert优化 如果我们需要一次性往数据库表中插入多条记录&#xff0c;可以从以下三个方面进行优化。 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into tb_test values(3,jerry); .....1.批量插入数据 Insert…

MySQL慢SQL探究

文章目录 前言1、慢SQL捕获慢查询追踪配置方式 2、情况分析为什么查询会慢&#xff1f; 2.1 SQL执行计划分析explain执行计划分析PROFILE分析OPTIMIZER_TRACE分析 3、引擎参数配置分析I/O性能分析MySQL I/O参数 其他原因分析网络抖动单表数据量过大 总结 前言 我们在日常开发中…

【Mysql】SQL性能分析

【Mysql】SQL性能分析 文章目录 【Mysql】SQL性能分析1. SQL执行频率2. 慢查询日志3. profile详情4. explain 1. SQL执行频率 在控制台中通过命令 show [session|global] status 命令可以提供服务器状态信息。通过如下指令&#xff0c;可以查看当前数据库的 insert,update,del…

MemSQL可以为时间序列应用做些什么

版权声明&#xff1a;本文由腾讯云数据库产品团队整理&#xff0c;页面原始内容来自于db weekly英文官网&#xff0c;若转载请注明出处。翻译目的在于传递更多全球最新数据库领域相关信息&#xff0c;并不意味着腾讯云数据库产品团队赞同其观点或证实其内容的真实性。如果其他媒…

MySQL-SQL优化

文章目录 一、插入数据1、insert2、大批量插入数据 二、主键优化&#xff08;1&#xff09;数据组织方式&#xff08;2&#xff09;页分裂&#xff08;3&#xff09;页合并&#xff08;4&#xff09;索引设计原则 三、order by优化四、group by优化五、limit优化六、count优化1…

每秒1.28万亿行,最快的分布式关系数据库MemSQL又破记录了!

众所周知&#xff0c;如果交互式响应时间小于四分之一秒&#xff0c;那么人们会获得令人难以置信的满意度。当你提供的响应时间下降到大约四分之一秒时&#xff0c;交互对用户而言是即时的。 但是&#xff0c;由于大数据集和并发需求&#xff0c;给所有客户提供的速度水平似乎…

速度最快的数据库---MEMSQL的安装与部署

1. 什么是MEMSQL 前Facebook工程师创办的MemSQL公司获500万美元投资。号称世界上最快的分布式关系型数据库&#xff0c;兼容MySQL但快30倍&#xff0c;能实现每秒150万次事务。原理是仅用内存并将SQL预编译为C。2012年12月14&#xff0c;MemSQL 1.8 发布&#xff0c;号称最快的…

memsql-官宣世界最快的内存关系型数据库安装部署

官网地址&#xff1a;https://www.memsql.com/ 获取到的license:BGNhZmY4YjViM2Y1OTRhOTdiOTNlNTE0NmU3MGJhN2NlAAAAAAAAAAAEAAAAAAAAAAwwNAIYJLLETZcXn8NHKfJAS/Iai5hUjzaCMQ5PAhht2vDZAS1q1a49DPsq5gMGKY9AI0wmaSkAAA 1&#xff0c;memsql官网介绍 MemSQL 是一个分布式关系数…

memSQL简介

前言 由前Facebook工程师创办的MemSQL&#xff0c;号称世界上最快的分布式关系型数据库&#xff0c;兼容MySQL但快30倍&#xff0c;能实现每秒150万次事务。原理是仅用内存并将SQL预编译为C。 MemSQL 提供免费的开发者版本&#xff08;数据限制32G&#xff09;和全功能试用版…

统一异常处理解决方案

&#x1f481; 作者&#xff1a;小瓦匠 &#x1f496; 欢迎关注我的个人公众号&#xff1a;小瓦匠学编程。微信号&#xff1a;xiaowajiangxbc &#x1f4e2; 本中涉及到的所有代码资源&#xff0c;可以在公众号中获取&#xff0c;关注并回复&#xff1a;源码下载 &#x1f449;…

SpringBoot统一异常处理详解

文章目录 一、概述1、统一异常处理介绍2、原理和目标 二、Assert(断言)1、概述2、Assert自定义实战2.1 自定义接口Assert2.2 自定义异常2.3 Enum整合2.4 实战检测 三、统一异常处理器1、异常处理器说明1.1 handleServletException1.2 handleBindException和handleValidExceptio…

Shell 异常处理

原创&#xff1a;转载请注明出处 #!/bin/bash ##################服务器执行以下脚本############################# ## 重新上传脚本到服务器 -> 部署启动的脚本#当任何一行的命令执行错误的时候&#xff08;比如命令写错了&#xff09;直接退出&#xff0c;不继续往下执行…

java中的统一异常处理

目录 统一异常处理的原因 如果进行统一异常处理 1、编写统一异常处理类与方法 2、编写自定义异常类 3、定义异常枚举类 4、抛出指定异常 小提醒 统一异常处理的原因 在我们写代码的时候&#xff0c;因为各种场景需要进行各种校验&#xff0c;我们就可能会进行多种响应&…

JNI异常处理

前言 本文所要介绍的异常处理是指通过JNI调用java层方法时产生的异常处理&#xff0c;并不是指JNI调用Native层函数时产生的异常处理&#xff0c;如果童鞋们想要了解Native层的异常处理可以参考笔者之前的文章《C之异常处理》 按照java的经验&#xff0c;当发生异常而又没有捕…

Python——异常处理

文章目录 异常Python中的异常类捕获与处理异常自定义异常类with语句断言 异常 异常是在程序执行过程中发生的影响程序正常执行的一个事件。异常是Python对象&#xff0c;当Python无法正常处理程序时就会抛出一个异常。一旦Python脚本发生异常&#xff0c;程序需要捕获并处理它…