读书人

Web Service Context示范

发布时间: 2012-10-24 14:15:58 作者: rapoo

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

读书人网 >Web前端

热点推荐