博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Apache CXF 整合 RESTful Services
阅读量:6169 次
发布时间:2019-06-21

本文共 12022 字,大约阅读时间需要 40 分钟。

  hot3.png

一、首先还是创建个项目并把包导入去,弄2个package,分别用于装server和client。记得要把commons-httpclient-3.1.jar也要放入来,因为Client用http请求的:

二、在com.yao.server下新建一个类Customer,我们注意到有一个@XmlRootElement(name="Customer")这个是用来标识Customer是可用来转化为xml的:

package com.yao.rs.server;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name="Customer")public class Customer {	private long id;    private String name;	@Override	public String toString() {		return "Customer [id=" + id + ", name=" + name + "]";	}	public long getId() {		return id;	}	public void setId(long id) {		this.id = id;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	}

三、同理再新建一个类Product:
package com.yao.rs.server;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name="Product")public class Product {	private long id;    private String description;	public long getId() {		return id;	}	public void setId(long id) {		this.id = id;	}	public String getDescription() {		return description;	}	public void setDescription(String description) {		this.description = description;	}	@Override	public String toString() {		return "Product [id=" + id + ", description=" + description + "]";	}        }

四、再新建一个Order类。该类有一个getProduct方法,通过id返回一个 Product实例。:该方法有2个注释@GET和@Path("products/{productId}/"),前者表示为用get发起请求,后者为匹配的路径,下面的Client会用到这个请求。

package com.yao.rs.server;import java.util.HashMap;import java.util.Map;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.PathParam;public class Order {	private long id;    private String description;    private Map
products = new HashMap
(); public Order(){ init(); } final void init() { Product p = new Product(); p.setId(323); p.setDescription("product 323"); products.put(p.getId(), p); } @GET @Path("products/{productId}/") public Product getProduct(@PathParam("productId") int productId){ System.out.println("----invoking getProduct with id: " + productId); Product p = products.get(new Long(productId)); return p; } public long getId() { return id; } public void setId(long id) { this.id = id; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public String toString() { return "Order [id=" + id + ", description=" + description + ", products=" + products + "]"; } }

五、新建CustomerService类,这个类为客户端要调用的。每一个方法都有对应的请求方式与匹配路径,以便客户端可以匹配调用。

package com.yao.rs.server;import java.util.HashMap;import java.util.Map;import javax.ws.rs.DELETE;import javax.ws.rs.GET;import javax.ws.rs.POST;import javax.ws.rs.PUT;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import javax.ws.rs.Produces;import javax.ws.rs.core.Response;@Path("/customerservice/")@Produces("text/xml")//可以通过修改@Produces注解来声明暴露接口返回的json还是xml数据格式public class CustomerService {    long currentId = 123;    Map
customers = new HashMap
(); Map
orders = new HashMap
(); public CustomerService() { init(); } @GET @Path("/customers/{id}/") public Customer getCustomer(@PathParam("id") String id) { System.out.println("----invoking getCustomer, Customer id is: " + id); long idNumber = Long.parseLong(id); Customer c = customers.get(idNumber); return c; } @PUT @Path("/customers/") public Response updateCustomer(Customer customer) { System.out.println("----invoking updateCustomer, Customer name is: " + customer.getName()); Customer c = customers.get(customer.getId()); Response r; if (c != null) { customers.put(customer.getId(), customer); r = Response.ok().build(); } else { r = Response.notModified().build(); } return r; } @POST @Path("/customers/") public Response addCustomer(Customer customer) { System.out.println("----invoking addCustomer, Customer name is: " + customer.getName()); customer.setId(++currentId); customers.put(customer.getId(), customer); return Response.ok(customer).build(); } @DELETE @Path("/customers/{id}/") public Response deleteCustomer(@PathParam("id") String id) { System.out.println("----invoking deleteCustomer, Customer id is: " + id); long idNumber = Long.parseLong(id); Customer c = customers.get(idNumber); Response r; if (c != null) { r = Response.ok().build(); customers.remove(idNumber); } else { r = Response.notModified().build(); } return r; } @Path("/orders/{orderId}/") public Order getOrder(@PathParam("orderId") String orderId) { System.out.println("----invoking getOrder, Order id is: " + orderId); long idNumber = Long.parseLong(orderId); Order c = orders.get(idNumber); return c; } final void init() { Customer c = new Customer(); c.setName("John"); c.setId(123); customers.put(c.getId(), c); Order o = new Order(); o.setDescription("order 223"); o.setId(223); orders.put(o.getId(), o); }}

六、新建一个source folder名为config,在里面放置2个文件add_customer.xml和update_customer.xml用于客户端增加与更新的xml文件。如下为其代码:

    6.1 add_customer.xml

Jack

    6.2 update_customer.xml

Mary
123
七、新建Server启动类:

package com.yao.rs.server;import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;public class Server {	protected Server() throws Exception {		JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();		sf.setResourceClasses(CustomerService.class);		sf.setResourceProvider(CustomerService.class, new SingletonResourceProvider(new CustomerService()));		sf.setAddress("http://localhost:9000/");		sf.create();	}	public static void main(String args[]) throws Exception {		new Server();		System.out.println("Server ready...");		Thread.sleep(5 * 6000 * 1000);		System.out.println("Server exiting");		System.exit(0);	}}
八、新建客户端类Client:

package com.yao.rs.client;import java.io.File;import java.io.InputStream;import java.net.URL;import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.methods.FileRequestEntity;import org.apache.commons.httpclient.methods.PostMethod;import org.apache.commons.httpclient.methods.PutMethod;import org.apache.commons.httpclient.methods.RequestEntity;import org.apache.cxf.helpers.IOUtils;import org.apache.cxf.io.CachedOutputStream;import org.apache.cxf.resource.URIResolver;public final class Client {    private Client() {    }    public static void main(String args[]) throws Exception {        // Sent HTTP GET request to query all customer info        /*         * URL url = new URL("http://localhost:9000/customers");         * System.out.println("Invoking server through HTTP GET to query all         * customer info"); InputStream in = url.openStream(); StreamSource         * source = new StreamSource(in); printSource(source);         */        // Sent HTTP GET request to query customer info        System.out.println("Sent HTTP GET request to query customer info");        URL url = new URL("http://localhost:9000/customerservice/customers/123");        InputStream in = url.openStream();        System.out.println(getStringFromInputStream(in));        // Sent HTTP GET request to query sub resource product info        System.out.println("\n");        System.out.println("Sent HTTP GET request to query sub resource product info");        url = new URL("http://localhost:9000/customerservice/orders/223/products/323");        in = url.openStream();        System.out.println(getStringFromInputStream(in));        // Sent HTTP PUT request to update customer info        System.out.println("\n");        System.out.println("Sent HTTP PUT request to update customer info");        Client client = new Client();        String inputFile = client.getClass().getResource("/update_customer.xml").getFile();        URIResolver resolver = new URIResolver(inputFile);        File input = new File(resolver.getURI());        PutMethod put = new PutMethod("http://localhost:9000/customerservice/customers");        RequestEntity entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1");        put.setRequestEntity(entity);        HttpClient httpclient = new HttpClient();        try {            int result = httpclient.executeMethod(put);            System.out.println("Response status code: " + result);            System.out.println("Response body: ");            System.out.println(put.getResponseBodyAsString());        } finally {            // Release current connection to the connection pool once you are            // done            put.releaseConnection();        }        // Sent HTTP POST request to add customer        System.out.println("\n");        System.out.println("Sent HTTP POST request to add customer");        inputFile = client.getClass().getResource("/add_customer.xml").getFile();        resolver = new URIResolver(inputFile);        input = new File(resolver.getURI());        PostMethod post = new PostMethod("http://localhost:9000/customerservice/customers");        post.addRequestHeader("Accept" , "text/xml");        entity = new FileRequestEntity(input, "text/xml; charset=ISO-8859-1");        post.setRequestEntity(entity);        httpclient = new HttpClient();        try {            int result = httpclient.executeMethod(post);            System.out.println("Response status code: " + result);            System.out.println("Response body: ");            System.out.println(post.getResponseBodyAsString());        } finally {            // Release current connection to the connection pool once you are            // done            post.releaseConnection();        }        System.out.println("\n");        System.exit(0);    }    private static String getStringFromInputStream(InputStream in) throws Exception {        CachedOutputStream bos = new CachedOutputStream();        IOUtils.copy(in, bos);        in.close();        bos.close();        return bos.getOut().toString();    }}

九、启动Server类打印:

2014-8-22 12:45:34 org.apache.cxf.endpoint.ServerImpl initDestination信息: Setting the server's publish address to be http://localhost:9000/2014-8-22 12:45:34 org.eclipse.jetty.server.Server doStart信息: jetty-8.1.15.v201404112014-8-22 12:45:34 org.eclipse.jetty.server.AbstractConnector doStart信息: Started SelectChannelConnector@localhost:90002014-8-22 12:45:35 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromWSDL信息: Creating Service {http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01}Discovery from WSDL: classpath:/org/apache/cxf/ws/discovery/wsdl/wsdd-discovery-1.1-wsdl-os.wsdl2014-8-22 12:45:35 org.apache.cxf.endpoint.ServerImpl initDestination信息: Setting the server's publish address to be soap.udp://239.255.255.250:37022014-8-22 12:45:35 org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean buildServiceFromClass信息: Creating Service {http://docs.oasis-open.org/ws-dd/ns/discovery/2009/01}DiscoveryProxy from class org.apache.cxf.jaxws.support.DummyImplServer ready...

十、启动Client类打印:

Sent HTTP GET request to query customer info
123
John
Sent HTTP GET request to query sub resource product info
product 323
323
Sent HTTP PUT request to update customer infoResponse status code: 200Response body: Sent HTTP POST request to add customerResponse status code: 200Response body:
124
Jack

同时Server的端口也会打印:

----invoking getCustomer, Customer id is: 123----invoking getOrder, Order id is: 223----invoking getProduct with id: 323----invoking updateCustomer, Customer name is: Mary----invoking addCustomer, Customer name is: Jack

十一、最终工程的目录如下:

转载于:https://my.oschina.net/jamaly/blog/305525

你可能感兴趣的文章
jQuery each和js forEach用法比较
查看>>
前端笔记-作用域链的一些理解加记录(JS高级程序设计读书笔记1)
查看>>
改造你的网站,变身 PWA
查看>>
Leetcode 142. Linked List Cycle IIJAVA语言
查看>>
网络基础5
查看>>
Exchange Supported operating system platforms
查看>>
unity3鼠标点击移动
查看>>
Linux 安装中文包
查看>>
谷物大脑
查看>>
访问控制-禁止php解析、user_agent,PHP相关配置
查看>>
AgileEAS.NET之系统架构
查看>>
python3.5里的正则表达式
查看>>
Exchange server 2013 SP1 客户端会议室邮箱自动回复延迟
查看>>
nginx反向代理缓存服务器构建
查看>>
RHEL6 搭建LVS/DR 负载均衡集群 案例
查看>>
以太坊·Rinkeby 测试网络
查看>>
字符串按规则排序算法
查看>>
MPLS + BGP高级特性
查看>>
plist文件读写操作
查看>>
oracle resetlogs和noresetlogs 创建控制文件区别
查看>>