CXF之动态客户端实例

CXF之动态客户端实例

分类: webservice(CXF) 2793人阅读 评论(0) 收藏 举报

 

通常创建一个web服务的客户端包括SEI的java接口和客户端输入输出应用的一些java类,这不总是可取的或实用的。

CXF支持不同的选择,允许一个应用连接到服务而不使用SEI和一些数据类。本页面介绍CXF的动态客户端工具,有了动态客户端,CXF就可以在运行时生成SEI和一些Bean类,也允许你通过API调用操作,即采取对象或使用反射来应用代理。

 

 

服务接口:

  1. package test.cxf;  
  2. import javax.jws.WebParam;  
  3. import javax.jws.WebService;  
  4. @WebService  
  5. public interface HelloWorld {  
  6.     public Person sayPerson(  
  7.             @WebParam(name="personName")String personName,  
  8.             @WebParam(name="address")Address address);  
  9. }  
 

 

服务实现类:

  1. package test.cxf;  
  2. import javax.jws.WebService;  
  3. @WebService(endpointInterface="test.cxf.HelloWorld")  
  4. public class HelloWorldImpl implements HelloWorld {  
  5.     public Person sayPerson(String personName, Address address) {  
  6.           
  7.         Person p = new Person();  
  8.         p.setPersonName(personName);  
  9.         p.setAddress(address);  
  10.         p.setAge(30);  
  11.           
  12.         System.out.println("server--" + p.getPersonName());  
  13.         System.out.println("server--" + p.getAge());  
  14.         System.out.println("server--" + p.getAddress().getAddress1()+":" + p.getAddress().getAddress2());  
  15.         return p;  
  16.     }  
  17. }  
 

 

对象 Person:

  1. package test.cxf;  
  2. import java.io.Serializable;  
  3. import javax.xml.bind.annotation.XmlAccessType;  
  4. import javax.xml.bind.annotation.XmlAccessorType;  
  5. @XmlAccessorType(XmlAccessType.FIELD)  
  6. public class Person implements Serializable{  
  7.     private String personName;  
  8.     private Integer age;  
  9.     private Address address;  
  10.     public String getPersonName() {  
  11.         return personName;  
  12.     }  
  13.     public void setPersonName(String personName) {  
  14.         this.personName = personName;  
  15.     }  
  16.     public Integer getAge() {  
  17.         return age;  
  18.     }  
  19.     public void setAge(Integer age) {  
  20.         this.age = age;  
  21.     }  
  22.     public Address getAddress() {  
  23.         return address;  
  24.     }  
  25.     public void setAddress(Address address) {  
  26.         this.address = address;  
  27.     }  
  28. }  
 

 

对象Address:

  1. package test.cxf;  
  2. import java.io.Serializable;  
  3. import javax.xml.bind.annotation.XmlAccessType;  
  4. import javax.xml.bind.annotation.XmlAccessorType;  
  5. @XmlAccessorType(XmlAccessType.FIELD)  
  6. public class Address implements Serializable{  
  7.     private String address1;  
  8.     private String address2;  
  9.     public String getAddress1() {  
  10.         return address1;  
  11.     }  
  12.     public void setAddress1(String address1) {  
  13.         this.address1 = address1;  
  14.     }  
  15.     public String getAddress2() {  
  16.         return address2;  
  17.     }  
  18.     public void setAddress2(String address2) {  
  19.         this.address2 = address2;  
  20.     }  
  21. }  
 

 

异常定义:

  1. package test.cxf;  
  2. import javax.xml.bind.annotation.XmlAccessType;  
  3. import javax.xml.bind.annotation.XmlAccessorType;  
  4. import javax.xml.ws.WebFault;  
  5. @XmlAccessorType(XmlAccessType.FIELD)  
  6. @WebFault(name="DynamicClientException")  
  7. public class DynamicClientException extends Exception {  
  8.     public DynamicClientException(){  
  9.         super();  
  10.         System.out.println("DynamicClientException!!!");  
  11.     }  
  12. }  
 

 

服务端配置:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
  5.     xsi:schemaLocation="  
  6.     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
  7.     http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">  
  8.     <import resource="classpath:META-INF/cxf/cxf.xml" />  
  9.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
  10.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
  11.       
  12.     <bean id="helloworldImpl" class="test.cxf.HelloWorldImpl"/>  
  13.     <jaxws:endpoint id="helloworldService" implementor="#helloworldImpl" address="/helloworld"/>  
  14. </beans>  
 

 

客户端调用-----关键就在这里:

  1. package test.cxf;  
  2. import java.lang.reflect.Method;  
  3. import org.apache.cxf.endpoint.Client;  
  4. import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;  
  5. public class ClientObj {  
  6.     public static void main(String[] args){  
  7.         JaxWsDynamicClientFactory dynamicClient = JaxWsDynamicClientFactory.newInstance();  
  8.         Client client = dynamicClient.createClient("http://localhost:8085/cxf-dynamicClientFactory/service/helloworld?wsdl");  
  9.         Object address = null;  
  10.         try {  
  11.             address = Thread.currentThread().getContextClassLoader().loadClass("test.cxf.Address").newInstance();  
  12.             Method m2 = address.getClass().getMethod("setAddress1",String.class);  
  13.             Method m3 = address.getClass().getMethod("setAddress2",String.class);  
  14.             m2.invoke(address, "qqqqqqq");  
  15.             m3.invoke(address, "ttttttt");  
  16.             Object[] rspArr = client.invoke("sayPerson""fhd", address);  
  17.             if (null != rspArr && rspArr.length > 0) {  
  18.                   
  19.                 Method m4 = rspArr[0].getClass().getMethod("getAge");  
  20.                 Object obj1 = m4.invoke(rspArr[0]);  
  21.                 System.out.println("ggggg:" + (Integer)obj1);  
  22.                   
  23.                 Method m5 = rspArr[0].getClass().getMethod("getPersonName");  
  24.                 Object obj2 = m5.invoke(rspArr[0]);  
  25.                 System.out.println("vvvvv" + (String)obj2);  
  26.                   
  27.                 Method m6 = rspArr[0].getClass().getMethod("getAddress");  
  28.                 Object obj3 = m6.invoke(rspArr[0]);  
  29.                 Method m7 = obj3.getClass().getMethod("getAddress1");  
  30.                 Method m8 = obj3.getClass().getMethod("getAddress2");  
  31.                 Object o1 = m7.invoke(obj3);  
  32.                 Object o2 = m8.invoke(obj3);  
  33.                 System.out.println("ssssss" + (String)o1 + "<<>>" + (String)o2);  
  34.             }  
  35.               
  36.         } catch (Exception e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.     }  
  40. }  
 

 

你可能会问自己下面这个问题:“类名'com.acme.Person'从哪里来”?是通过运行"wsdl2java'并审查结果来得到类名。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!关于使用Spring Boot和Apache CXF开发客户端的问题,我可以为您提供一些指导。 首先,您需要在您的Spring Boot项目中添加CXF的依赖。可以在您的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxws</artifactId> <version>3.4.1</version> </dependency> ``` 接下来,您可以创建一个CXF客户端来调用远程WebService。您可以使用`@WebServiceClient`注解来生成客户端代码。例如,假设您要调用一个名为"HelloWorldService"的WebService: ```java @WebServiceClient(name = "HelloWorldService", targetNamespace = "http://example.com/", wsdlLocation = "http://example.com/HelloWorldService?wsdl") public class HelloWorldServiceClient extends Service { public HelloWorldServiceClient(URL wsdlLocation, QName serviceName) { super(wsdlLocation, serviceName); } public HelloWorldService getHelloWorldServicePort() { return super.getPort(HelloWorldService.class); } } ``` 在上面的代码中,`wsdlLocation`参数指定了远程WebService的WSDL地址。`getHelloWorldServicePort()`方法返回了一个用于调用WebService方法的接口。 接下来,您可以在您的Spring Boot应用程序中使用这个客户端。您可以将它注入到您的服务或控制器中,并使用它来调用远程WebService方法。例如: ```java @Service public class MyService { @Autowired private HelloWorldServiceClient helloWorldServiceClient; public void invokeRemoteService() { HelloWorldService helloWorldService = helloWorldServiceClient.getHelloWorldServicePort(); String result = helloWorldService.sayHello("World"); System.out.println(result); } } ``` 在上面的代码中,通过`helloWorldServiceClient.getHelloWorldServicePort()`方法获取到了远程WebService的接口实例,然后可以调用其中的方法。 这就是使用Spring Boot和CXF开发客户端的基本步骤。您可以根据您的具体需求进一步进行配置和调整。希望对您有所帮助!如果您有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值