zoukankan      html  css  js  c++  java
  • CXF之动态客户端实例

    转自:http://blog.csdn.net/fhd001/article/details/5779411

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

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

    服务接口:

        package test.cxf;  
        import javax.jws.WebParam;  
        import javax.jws.WebService;  
        @WebService  
        public interface HelloWorld {  
            public Person sayPerson(  
                    @WebParam(name="personName")String personName,  
                    @WebParam(name="address")Address address);  
        }  

    服务实现类:

        package test.cxf;  
        import javax.jws.WebService;  
        @WebService(endpointInterface="test.cxf.HelloWorld")  
        public class HelloWorldImpl implements HelloWorld {  
            public Person sayPerson(String personName, Address address) {  
                  
                Person p = new Person();  
                p.setPersonName(personName);  
                p.setAddress(address);  
                p.setAge(30);  
                  
                System.out.println("server--" + p.getPersonName());  
                System.out.println("server--" + p.getAge());  
                System.out.println("server--" + p.getAddress().getAddress1()+":" + p.getAddress().getAddress2());  
                return p;  
            }  
        }  

    对象 Person:

        package test.cxf;  
        import java.io.Serializable;  
        import javax.xml.bind.annotation.XmlAccessType;  
        import javax.xml.bind.annotation.XmlAccessorType;  
        @XmlAccessorType(XmlAccessType.FIELD)  
        public class Person implements Serializable{  
            private String personName;  
            private Integer age;  
            private Address address;  
            public String getPersonName() {  
                return personName;  
            }  
            public void setPersonName(String personName) {  
                this.personName = personName;  
            }  
            public Integer getAge() {  
                return age;  
            }  
            public void setAge(Integer age) {  
                this.age = age;  
            }  
            public Address getAddress() {  
                return address;  
            }  
            public void setAddress(Address address) {  
                this.address = address;  
            }  
        }  

    对象Address:

        package test.cxf;  
        import java.io.Serializable;  
        import javax.xml.bind.annotation.XmlAccessType;  
        import javax.xml.bind.annotation.XmlAccessorType;  
        @XmlAccessorType(XmlAccessType.FIELD)  
        public class Address implements Serializable{  
            private String address1;  
            private String address2;  
            public String getAddress1() {  
                return address1;  
            }  
            public void setAddress1(String address1) {  
                this.address1 = address1;  
            }  
            public String getAddress2() {  
                return address2;  
            }  
            public void setAddress2(String address2) {  
                this.address2 = address2;  
            }  
        }  

    异常定义:

        package test.cxf;  
        import javax.xml.bind.annotation.XmlAccessType;  
        import javax.xml.bind.annotation.XmlAccessorType;  
        import javax.xml.ws.WebFault;  
        @XmlAccessorType(XmlAccessType.FIELD)  
        @WebFault(name="DynamicClientException")  
        public class DynamicClientException extends Exception {  
            public DynamicClientException(){  
                super();  
                System.out.println("DynamicClientException!!!");  
            }  
        }  

    服务端配置:

        <?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.xsd  
            http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">  
            <import resource="classpath:META-INF/cxf/cxf.xml" />  
            <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
            <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
              
            <bean id="helloworldImpl" class="test.cxf.HelloWorldImpl"/>  
            <jaxws:endpoint id="helloworldService" implementor="#helloworldImpl" address="/helloworld"/>  
        </beans>  

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

        package test.cxf;  
        import java.lang.reflect.Method;  
        import org.apache.cxf.endpoint.Client;  
        import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;  
        public class ClientObj {  
            public static void main(String[] args){  
                JaxWsDynamicClientFactory dynamicClient = JaxWsDynamicClientFactory.newInstance();  
                Client client = dynamicClient.createClient("http://localhost:8085/cxf-dynamicClientFactory/service/helloworld?wsdl");  
                Object address = null;  
                try {  
                    address = Thread.currentThread().getContextClassLoader().loadClass("test.cxf.Address").newInstance();  
                    Method m2 = address.getClass().getMethod("setAddress1",String.class);  
                    Method m3 = address.getClass().getMethod("setAddress2",String.class);  
                    m2.invoke(address, "qqqqqqq");  
                    m3.invoke(address, "ttttttt");  
                    Object[] rspArr = client.invoke("sayPerson", "fhd", address);  
                    if (null != rspArr && rspArr.length > 0) {  
                          
                        Method m4 = rspArr[0].getClass().getMethod("getAge");  
                        Object obj1 = m4.invoke(rspArr[0]);  
                        System.out.println("ggggg:" + (Integer)obj1);  
                          
                        Method m5 = rspArr[0].getClass().getMethod("getPersonName");  
                        Object obj2 = m5.invoke(rspArr[0]);  
                        System.out.println("vvvvv" + (String)obj2);  
                          
                        Method m6 = rspArr[0].getClass().getMethod("getAddress");  
                        Object obj3 = m6.invoke(rspArr[0]);  
                        Method m7 = obj3.getClass().getMethod("getAddress1");  
                        Method m8 = obj3.getClass().getMethod("getAddress2");  
                        Object o1 = m7.invoke(obj3);  
                        Object o2 = m8.invoke(obj3);  
                        System.out.println("ssssss" + (String)o1 + "<<>>" + (String)o2);  
                    }  
                      
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
            }  
        }  

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

  • 相关阅读:
    洛谷 P3389 【模板】高斯消元法
    洛谷 P2090 数字对
    树链剖分
    bzoj3784 树上的路径
    K Seq HihoCoder
    一些奇怪的注意事项
    洛谷 P3437 [POI2006]TET-Tetris 3D
    洛谷 P2048 [NOI2010]超级钢琴 || Fantasy
    JVM字节码指令
    java中什么是Bridge Method(桥接方法)
  • 原文地址:https://www.cnblogs.com/tv151579/p/2943616.html
Copyright © 2011-2022 走看看