Web service context指Endpoint之间传输的消息。Context内容以键值对格式(Map)进行存储,包括incoming和outgoing
Message.
CXF提供了访问上下文数据的对象:javax.xml.ws.handler.MessageContext,而MessageContext与Message所在的
Scope有关:
Application Scope: 定义在该Scope中的 MessageContext可被Service Provider, Service Consumer, Handler实现访问。
任何Message上下文Property在Service Provider或Service Consumer中设置的默认Scope是Application.
Handle Scope:只能被Handler实现访问.任何Message上下文由Handler实现的,则默认Scope是Handler.
可通过MessageContext对象的setScope方法改变MessageContext的Scope.
完整代码参考http://springsfeng.iteye.com/blog/1634753附件。
实例:
import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.namespace.QName;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import org.apache.cxf.message.Message;
@WebService(serviceName = "OrderProcessService", portName = "OrderProcessPort")
public class OrderProcessImpl implements OrderProcess {
@Resource
WebServiceContext wsc;
public String processOrder(Order order) {
System.out.println("Processing order...");
String orderID = validate(order);
return orderID;
}
/**
* Validates the order and returns the order ID
**/
private String validate(Order order) {
System.out.println("Getting the operation info from the message context ");
MessageContext ctx = wsc.getMessageContext();
QName operation = (QName) ctx.get(Message.WSDL_OPERATION);
System.out.println("The operation name is " + operation);
String custID = order.getCustomerID();
String itemID = order.getItemID();
int qty = order.getQty();
double price = order.getPrice();
if (custID != null && itemID != null && !custID.equals("") && !itemID.equals("") && qty > 0 && price > 0.0) {
return "ORD1234";
}
return null;
}
}
发布服务:
import javax.xml.ws.Endpoint;
public class Server {
protected Server() throws Exception {
System.out.println("Starting Server");
OrderProcessImpl orderProcessImpl = new OrderProcessImpl();
String address = "http://localhost:8080/OrderProcess";
Endpoint.publish(address, orderProcessImpl);
}
public static void main(String args[]) throws Exception {
new Server();
System.out.println("Server ready...");
Thread.sleep(50 * 60 * 1000);
System.out.println("Server exiting");
System.exit(0);
}
}
Client:
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import org.pcdp.sample.context.Order;
import org.pcdp.sample.context.OrderProcess;
public class Client {
private static final QName SERVICE_NAME = new QName("http://context.sample.pcdp.org/", "OrderProcessService");
private static final QName PORT_NAME = new QName("http://context.sample.pcdp.org/", "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);
}
}
Client输出:
2012-8-17 11:28:19 org.apache.cxf.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL 信息: Creating Service {http://context.sample.pcdp.org/}OrderProcessService from WSDL: http://localhost:8080/OrderProcess?wsdl The order ID is ORD1234
Server 输出:
Processing order... Getting the operation info from the message context The operation name is {http://context.sample.pcdp.org/}processOrder