Cxf开发webservice时遇到Can't find the request for xx's Observer

本文介绍了一种解决使用CXF开发Web Service时出现404错误的方法。通过调整web.xml中的CXFServlet配置,避免了请求被错误地映射,从而解决了无法找到服务的问题。

最近在用CXF开发web service时遇到这个很郁闷的问题。配置一切都正常,启动tomcat也正常,但是当在IE浏览器中输入http://localhost:8080/工程名时http://localhost:8080/工程名时,报404,控制台报Can't find the request for http://localhost:8080/工程名's Observer;

这就奇怪了,后来根据参照网址中的crossdqw的解答找到了解决方案,厉害!

你在客户端删掉web.xml中的cxf配置或者是在mapping中不要让它映射所有<servlet-mapping>
  <servlet-name>CXFServlet</servlet-name>
  <url-pattern>/加上路径/*</url-pattern>
  </servlet-mapping>
不然就会首先映射CXFServlet,就会找不到服务!


参照:http://bbs.youkuaiyun.com/topics/370142426


<think> 我们正在处理一个关于Web服务的问题,用户报告说无法找到针对特定端点(http://localhost:8080/ws/userService)的观察者(Observer)。根据引用[2],我们了解到,当使用Web服务,通常会生成一个服务类(Service)和端口接口(PortType),然后通过端口调用服务方法。如果出现“无法找到观察者”的错误,这通常与SOAP消息的处理有关,可能是由于服务端点配置不正确或服务实现未正确部署。 根据引用[1]和引用[3],我们可以排除与会话(session)和请求转发/重定向相关的问题,因为Web服务调用通常不直接使用这些机制。 可能的原因和解决方案: 1. **服务端点地址不正确**:检查WSDL文件中定义的服务端点地址是否与请求地址一致。确保在生成客户端代码使用的WSDL地址正确,并且服务端部署的地址与客户端调用的地址一致。 2. **服务未正确部署**:确保服务已经成功部署到服务器(如Tomcat),并且可以通过浏览器或SOAPUI等工具访问WSDL。尝试访问WSDL(例如:http://localhost:8080/ws/userService?wsdl)来确认服务是否可用。 3. **服务实现类未注册**:在服务端,需要将服务实现类发布到指定端点。例如,使用JAX-WS,可能需要在web.xml中配置服务端点,或者使用@WebService注解并指定端点地址。 4. **客户端代码问题**:检查客户端生成的代码,确保调用的端口和地址正确。根据引用[2],客户端代码通常如下: ```java HelloService service = new HelloService(); HelloServicePortType port = service.getHelloServicePort(); String response = port.sayHello("Alice"); ``` 注意:`getHelloServicePort()`方法可能会返回一个绑定到特定地址的端口。如果服务地址变更,可能需要重新生成客户端代码,或者在运行指定地址: ```java HelloService service = new HelloService(); HelloServicePortType port = service.getHelloServicePort(); // 设置请求地址 ((javax.xml.ws.BindingProvider) port).getRequestContext().put( javax.xml.ws.BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8080/ws/userService"); ``` 5. **服务端拦截器或过滤器问题**:检查服务端是否有拦截器或过滤器阻止了请求。例如,可能需要配置CORS(跨域资源共享)以允许来自客户端的请求。 6. **网络问题**:确保服务器正在运行,且客户端可以访问该地址(例如,通过ping或telnet测试端口)。 7. **SOAP消息格式问题**:使用工具(如Postman或SOAPUI)发送一个手动构造的SOAP请求,查看服务端是否响应。如果服务端响应,则可能是客户端生成的消息格式不正确。 8. **服务端日志**:检查服务端日志,看是否有服务部署失败或请求处理过程中的异常信息。 **步骤总结:** 1. 验证服务端点是否可用(通过访问WSDL)。 2. 检查服务端配置(如web.xml、注解)确保服务在正确端点发布。 3. 检查客户端代码,确保调用的地址正确,必要在客户端代码中覆盖端点地址。 4. 使用工具测试服务端,排除客户端问题。 5. 查看服务端日志以获取错误详情。 如果问题仍然存在,请提供更多信息,如服务端和客户端配置代码、错误堆栈跟踪等。 </think>### 无法找到 http://localhost:8080/ws/userService 请求观察者的解决方案 根据您描述的问题,结合引用内容分析,这是典型的 Web Service 端点配置问题,以下是系统化的解决方案: --- ### 1. **验证服务端点配置** - 检查服务实现类是否通过注解声明了正确的端点地址: ```java @WebService(endpointInterface = "com.example.UserService", serviceName = "UserService", portName = "UserServicePort", targetNamespace = "http://example.com/") public class UserServiceImpl implements UserService { // 服务实现 } ``` - 确保 `endpointInterface` 路径与 WSDL 定义完全一致 - **关键点**:端点地址 `http://localhost:8080/ws/userService` 必须与 `@WebService` 注解的 `serviceName` 匹配[^2] --- ### 2. **检查服务发布配置** - 在 `web.xml` 中确认 CXF/Axis2 等框架的 Servlet 配置: ```xml <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <init-param> <param-name>wsdl-path</param-name> <param-value>/ws/userService</param-value> <!-- 必须匹配 --> </init-param> </servlet> ``` - 路径 `/ws/userService` 需与请求 URL 后缀完全一致(包括大小写) --- ### 3. **客户端调用修正** 按引用[2]方式调用,需显式指定端点地址: ```java UserService service = new UserService(); UserServicePortType port = service.getUserServicePort(); // 强制设置端点地址 ((BindingProvider)port).getRequestContext().put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8080/ws/userService"); String response = port.someMethod("param"); ``` > **说明**:Java WS 客户端默认使用 WSDL 中的地址,本地调试需覆盖为 `localhost` --- ### 4. **服务端日志诊断** 在服务启动日志中搜索: ```log INFO: Setting the server's publish address to be /ws/userService ``` 若未找到此日志,说明服务未成功发布到该路径,需检查: - 应用上下文路径(如 Tomcat 的 `server.xml` 中 `Context` 配置) - 是否与其他服务端点冲突 --- ### 5. **防火墙与跨域处理** - 关闭本地防火墙测试(Windows Defender/iptables) - 添加 CORS 过滤器(若浏览器访问): ```java response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS"); ``` --- ### 推荐验证步骤 1. 直接访问 WSDL 确认服务状态: ``` http://localhost:8080/ws/userService?wsdl ``` 2. 使用 SoapUI 发送测试请求 3. 在服务端断点调试 `getUserFilesPath()` 方法(引用[1]),验证请求是否进入服务 > **注意**:观察者(Observer)模式在 WS 中通常对应服务监听器,确保服务容器(如 Tomcat/Jetty)已正确加载服务实现类[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值