用cxf做了个小例子。出问题了。
在服务器的工程里写了一个java类调用webservice的方法,没有问题。但是新建一个工程,创建java类调用webservice的方法,报异常:
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: Message part {http://client/}sayHello was not recognized.  (Does it exist in service WSDL?)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:145)
at $Proxy44.sayHello(Unknown Source)
at client.Client.main(Client.java:16)
Caused by: org.apache.cxf.binding.soap.SoapFault: Message part {http://client/}sayHello was not recognized.  (Does it exist in service WSDL?)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:75)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:46)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:35)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:96)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:69)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:641)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:2108)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1987)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1912)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:611)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:236)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:469)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:299)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:251)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:124)
... 2 more
客户端的代码结构
Client.java:
package client;
import java.net.URL;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import server.IHelloWorld;
public class Client {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("clientbeans.xml");
IHelloWorld helloWorld = (IHelloWorld) context.getBean("helloWorldClient");
System.out.println(helloWorld.sayHello("Test")); 
}
}
IHelloWorld.java
package client;
import javax.jws.WebService;
@WebService
public interface IHelloWorld {
public String sayHello(String name);
}
clientbeans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws 
http://cxf.apache.org/schemas/jaxws.xsd">
<jaxws:client 
id="helloWorldClient" 
address="http://localhost:8080/CXFSpringServer/HelloWorld" 
serviceClass="client.IHelloWorld"/>
</beans>同样的代码放在服务器端的工程里没有问题。新建的工程报异常。求教大侠是什么原因,如何解决,小弟初学cxf

解决方案 »

  1.   

    很明显,错误提示 {http://client/}sayHello 这个请求是不存在的,我认为是你通过spring配置文件获取服务时出现了问题,如果你的请求是下面这样:
     {http://localhost:8080/CXFSpringServer/HelloWorld}sayHello
    这个请求就没有问题了。
      

  2.   

    cxf客户端可以通过下面的方式来获取服务:Service service = Service.create(SERVICE_NAME);
    String endpointAddress = "http://localhost:9000/userService";
    service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
    UserService userService = service.getPort(UserService.class);
      

  3.   

    请问楼主怎样解决的,小弟一模一样问题。想通过Spring配置的client调服务端方法