Web Service Context示例
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 {@ResourceWebServiceContext 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?wsdlThe 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