CXF JAVA 클 라 이언 트 개발

CXF 는 많은 client 측의 호출 방법 을 제공 했다.이 선택 들 을 빠르게 이해 하고 어떤 것 을 사용 하 는 지 판단 하 는 데 도움 을 준다.
 
참조:
http://cxf.apache.org/docs/how-do-i-develop-a-client.html
 
 
원본 코드 주 체 는 PacktPub. apache. cXF. Web. Service. development. dec. 2009 책의 코드 를 사용 합 니 다.이 사례 에 서 는 5 가지 호출 방식 을 한 공정 에 집중 하고 Maven 재 편 호출 방식 을 사용한다.
 
이 예 다운로드 주소:
 
http://dl.iteye.com/topics/download/c647dae6-de86-3eec-9590-7fcf83e9def4
 

  •   WSDL2Java generated Client

  •   JAX-WS Proxy

  •   JAX-WS Dispatch APIs

  •   JAX-WS Client Proxy

  •   Dynamic Client

  •   Reflection API

  •   Service Model API


  •  
    여기 서 디 스 패 치 는 이 절 내용 을 소개 하지 않 습 니 다.
     
    WSDL2Java generated Client
     
    wdl 파일 에 따라 자바 클 라 이언 트 를 만 들 고 직접 호출 하 는 것 이다.호출 방식, 즉 OrderProcessService 의 getOrderProcessPort 방법 을 보고 서비스의 인용 을 얻 습 니 다.
     
     
     
     
     
     
     
     
    시작 서버
    mvn test –Pserver
     
     
    서버 를 시작 할 때 maven - copiler - plugin 을 통 해 class 를 컴 파일 하고 cxf - codegen - plugin 을 통 해 src / main / resources / OrderProcess. wdl 에 따라 존 근 류 OrderProcessService 를 생 성 합 니 다.
     
     
    <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.5</source>
                        <target>1.5</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.cxf</groupId>
                    <artifactId>cxf-codegen-plugin</artifactId>
                    <version>${cxf.version}</version>
                    <executions>
                        <execution>
                            <id>generate-sources</id>
                            <phase>generate-sources</phase>
                            <configuration>
                                <wsdlOptions>
                                    <wsdlOption>
                                        <wsdl>src/main/resources/OrderProcess.wsdl</wsdl>
                                    </wsdlOption>
                                </wsdlOptions>
                            </configuration>
                            <goals>
                                <goal>wsdl2java</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>

      
     
     
     
     
     
    시작 클 라 이언 트
    mvn test -PStubClient
     
     
     
    JAX-WS Proxy
     
     
     
    존 근 류 를 만 드 는 방식 과 달리 proxy 는 wdl 2 자바 를 실행 할 필요 가 없다.그러나 컴 파일 환경 에 서 는 인터페이스 류 와 VO 류 가 필요 하 다.여기, WSDL 지정 을 통 해LOCATION 과 PORTNAME, Service. create 를 사용 하여 service 를 만 들 고 service. getPort 를 사용 하여 서비스 인용 을 받 습 니 다.
     
     
    package demo.order.client;
    
    import java.net.URL;
    import javax.xml.namespace.QName;
    import javax.xml.ws.Service;
    
    import demo.order.Order;
    import demo.order.OrderProcess;
    
    public class ProxyClient {
    
        private static final QName SERVICE_NAME = new QName("http://order.demo/", "OrderProcessService");
        private static final QName PORT_NAME = new QName("http://order.demo/", "OrderProcessPort");
    
        private static final String WSDL_LOCATION = "http://localhost:8080/OrderProcess?wsdl";
    
        public static void main(String args[]) throws Exception {
            URL wsdlURL = new URL(WSDL_LOCATION);
            Service service = Service.create(wsdlURL, SERVICE_NAME);
            OrderProcess port = service.getPort(PORT_NAME, OrderProcess.class);  
    
    		Order order = new Order();
    		order.setCustomerID("C001");
    		order.setItemID("I001");
    		order.setPrice(100.00);
    		order.setQty(20);
    
            String result = port.processOrder(order);
            System.out.println("The order ID is " + result);
        	
        }
        
    }

     
      
     
    시작 서버
    mvn test –Pserver 
    시작 클 라 이언 트
    mvn test -PProxyClient
     
     
     Client Proxy
     
     
    JaxWs Proxy Factory Bean 클래스 를 사용 하여 Proxy 를 간소화 합 니 다.
     
    package demo.order.client;
    
    
    import demo.order.Order;
    import demo.order.OrderProcess;
    import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
    
    public class ClientProxyClient {
    
        public static void main(String args[]) throws Exception {
            JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
            factory.setServiceClass(OrderProcess.class);
            factory.setAddress("http://localhost:8080/OrderProcess");
            OrderProcess service = (OrderProcess)factory.create();
    
    		Order order = new Order();
    		order.setCustomerID("C001");
    		order.setItemID("I001");
    		order.setPrice(100.00);
    		order.setQty(20);
    
            String result = service.processOrder(order);
            System.out.println("The order ID is " + result);
        	
        }
        
    }

     
     
     
     
    시작 서버
    mvn test –Pserver
    시작 클 라 이언 트
    mvn test -PClientProxyClient
     
    Dynamic Client 
     
    SEI 인터페이스 클래스 도 필요 없고,
    Reflection API
     
     
    JaxWsDynamicClient Factory. newInstance 에서 JaxWsDynamicClient Factory 인 스 턴 스 를 받 았 습 니 다.dcf. createClient 를 통 해 Client 클 라 이언 트 인용 을 얻 습 니 다.
     
    package demo.order.client;
    
    import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
    import org.apache.cxf.endpoint.Client;
    
    import java.lang.reflect.Method;
    
    public class OrderProcessJaxWsDynamicClient {
    	public OrderProcessJaxWsDynamicClient() {
    	}
    
    	public static void main(String str[]) throws Exception {
    		JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
    		Client client = dcf.createClient("http://localhost:8080/OrderProcess?wsdl");
                    
    		Object order = Thread.currentThread().getContextClassLoader().loadClass("demo.order.Order").newInstance();
    		Method m1 = order.getClass().getMethod("setCustomerID", String.class);
    		Method m2 = order.getClass().getMethod("setItemID", String.class);
    		Method m3 = order.getClass().getMethod("setQty", Integer.class);
    		Method m4 = order.getClass().getMethod("setPrice", Double.class);
    		m1.invoke(order, "C001");
    		m2.invoke(order, "I001");
    		m3.invoke(order, 100);
    		m4.invoke(order, 200.00);
                    
    		Object[] response = client.invoke("processOrder", order);
    		System.out.println("Response is " + response[0]);
    
    	}
    }

     
     
     
     
    시작 서버
    mvn test –Pserver
    시작 클 라 이언 트
    mvn test -POrderProcessJaxWsDynamicClient
     
     
     
     Service Model API
     
    마지막 으로 Service Model 은 CXF 에 내 장 된 Service 를 얻 는 정보 입 니 다.
     
     
     
    package demo.order.client;
    
    import java.beans.PropertyDescriptor;
    import java.util.List;
    
    import javax.xml.namespace.QName;
    
    import org.apache.cxf.endpoint.Client;
    import org.apache.cxf.endpoint.Endpoint;
    import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
    import org.apache.cxf.service.model.BindingInfo;
    import org.apache.cxf.service.model.BindingMessageInfo;
    import org.apache.cxf.service.model.BindingOperationInfo;
    import org.apache.cxf.service.model.MessagePartInfo;
    import org.apache.cxf.service.model.ServiceInfo;
    
    public class OrderProcessJaxWsDynClient {
    
        public OrderProcessJaxWsDynClient() {
        }
    
        public static void main(String str[]) throws Exception {
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
            Client client = dcf.createClient("http://localhost:8080/OrderProcess?wsdl");
            Endpoint endpoint = client.getEndpoint();
    
    
            // Make use of CXF service model to introspect the existing WSDL
            ServiceInfo serviceInfo = endpoint.getService().getServiceInfos().get(0);
            QName bindingName = new QName("http://order.demo/", "OrderProcessServiceSoapBinding");
            BindingInfo binding = serviceInfo.getBinding(bindingName);
            QName opName = new QName("http://order.demo/", "processOrder");
            BindingOperationInfo boi = binding.getOperation(opName); // Operation name is processOrder
            BindingMessageInfo inputMessageInfo = null;
            if (!boi.isUnwrapped()) {
                //OrderProcess uses document literal wrapped style.
                inputMessageInfo = boi.getWrappedOperation().getInput();
            } else {
                inputMessageInfo = boi.getUnwrappedOperation().getInput();
            }
    
            List<MessagePartInfo> parts = inputMessageInfo.getMessageParts();
            MessagePartInfo partInfo = parts.get(0); // Input class is Order
    
            // Get the input class Order
            Class<?> orderClass = partInfo.getTypeClass();
            Object orderObject = orderClass.newInstance();
    
            // Populate the Order bean
            // Set customer ID, item ID, price and quantity
            PropertyDescriptor custProperty = new PropertyDescriptor("customerID", orderClass);
            custProperty.getWriteMethod().invoke(orderObject, "C001");
            PropertyDescriptor itemProperty = new PropertyDescriptor("itemID", orderClass);
            itemProperty.getWriteMethod().invoke(orderObject, "I001");
            PropertyDescriptor priceProperty = new PropertyDescriptor("price", orderClass);
            priceProperty.getWriteMethod().invoke(orderObject, Double.valueOf(100.00));
            PropertyDescriptor qtyProperty = new PropertyDescriptor("qty", orderClass);
            qtyProperty.getWriteMethod().invoke(orderObject, Integer.valueOf(20));
    
            // Invoke the processOrder() method and print the result
            // The response class is String
            Object[] result = client.invoke(opName, orderObject);
            System.out.println("The order ID is " + result[0]);
        }
    }

     
     
     
     
    시작 서버
    mvn test –Pserver
    시작 클 라 이언 트
    mvn test -POrderProcessJaxWsDynClient

    좋은 웹페이지 즐겨찾기