cxf /webservice出错 org.apache.cxf.interceptor.Fault: No such operation: (HTTP GET PATH_INFO: /CxfDem

本文介绍了一种常见的CXF SOAP服务调用错误:访问路径未附加?wsdl导致的NoSuchOperation异常,并提供了解决方案。
警告: Interceptor for {http://test.cxf.bohua.com/}helloService has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: No such operation:  (HTTP GET PATH_INFO: /CxfDemo/helloService)
	at org.apache.cxf.interceptor.URIMappingInterceptor.handleMessage(URIMappingInterceptor.java:88)
	at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
	at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
	at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:238)
	at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:222)
	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:202)
	at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
	at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:239)
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:164)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
	at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)
	
	

解决方法:访问路径加上?wsdl
修改为http://localhost:8080/CxfDemo/helloService?wsdl

### 问题分析 当使用 Apache CXF 客户端调用 WebService 时,出现 `org.apache.cxf.interceptor.Fault: Response was of unexpected text/html ContentType` 错误,通常表示客户端接收到的响应内容类型不是预期的 `application/soap+xml` 或 `text/xml`,而是 `text/html`。这表明服务端返回了 HTML 页面而非 SOAP 响应,常见于服务未正确部署、请求路径错误或服务器发生内部异常导致重定向到错误页面(如 404 页面)等情况。 --- ### 解决方案 #### 1. 检查服务地址是否正确 确保客户端调用的服务地址与实际部署的服务地址一致。如果地址错误,服务器可能会返回 HTML 错误页面而不是 SOAP 响应。可以使用浏览器或 Postman 工具访问该 URL 验证是否能获取 WSDL 或正常响应[^3]。 ```java MyService service = new MyService(); MyPort port = service.getMyPort(); BindingProvider bp = (BindingProvider) port; bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://correct/service/url"); ``` #### 2. 查看服务端日志 检查服务端日志是否有异常抛出,例如空指针、类加载失败等,这些异常可能导致服务未正常响应,从而返回 HTML 错误页面。服务端配置文件中也可能存在命名空间不一致或参数缺失等问题,导致无法正确处理请求。 #### 3. 设置 Content-Type 请求头 在客户端设置正确的 Content-Type 请求头,确保请求被识别为 SOAP 消息: ```java Map<String, Object> reqContext = ((BindingProvider) port).getRequestContext(); reqContext.put("Content-Type", "text/xml; charset=utf-8"); ``` #### 4. 使用拦截器查看原始响应 通过添加自定义拦截器打印原始响应内容,确认服务端返回的数据格式是否为 XML 或 SOAP 格式,以判断问题出在客户端解析阶段还是服务端响应阶段: ```java public class LoggingInInterceptor extends AbstractSoapInterceptor { public LoggingInInterceptor() { super(Phase.PRE_PROTOCOL); } @Override public void handleMessage(SoapMessage message) throws Fault { InputStream is = message.getContent(InputStream.class); String response = IOUtils.toString(is); System.out.println("Response: " + response); } } ``` #### 5. 检查服务端命名空间和接口定义 若服务端实现类未指定正确的命名空间或接口定义与客户端不一致,也可能导致解析失败。确保服务端类和方法注解中的命名空间与客户端生成的代码一致: ```java @WebService(targetNamespace = "http://example.com/ns") public class MyServiceImpl implements MyServicePort { // 方法实现 } ``` --- ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值