CXF JAVA 클 라 이언 트 개발
참조:
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.