MyException - 我的异常网
当前位置:我的异常网» Web前端 » Spring调整CXF webservice restful 实例

Spring调整CXF webservice restful 实例

www.MyException.Cn  网友分享于:2013-08-16  浏览:0次
Spring整合CXF webservice restful 实例

webservice restful接口跟soap协议的接口实现大同小异,只是在提供服务的类/接口的注解上存在差异,具体看下面的代码,然后自己对比下就可以了。

用到的基础类

User.java

 

 
 1 @XmlRootElement(name="User")
 2 public class User {
 3 
 4     private String userName;
 5     private String sex;
 6     private int age;
 7     
 8     public User(String userName, String sex, int age) {
 9         super();
10         this.userName = userName;
11         this.sex = sex;
12         this.age = age;
13     }
14     
15     public User() {
16         super();
17     }
18 
19     public String getUserName() {
20         return userName;
21     }
22     public void setUserName(String userName) {
23         this.userName = userName;
24     }
25     public String getSex() {
26         return sex;
27     }
28     public void setSex(String sex) {
29         this.sex = sex;
30     }
31     public int getAge() {
32         return age;
33     }
34     public void setAge(int age) {
35         this.age = age;
36     }
37     
38     public static void main(String[] args) throws IOException {
39         System.setProperty("http.proxySet", "true"); 
40 
41         System.setProperty("http.proxyHost",  "192.168.1.20"); 
42 
43         System.setProperty("http.proxyPort", "8080");
44         
45         URL url = new URL("http://www.baidu.com"); 
46 
47         URLConnection con =url.openConnection(); 
48         
49         System.out.println(con);
50     }
51 }
 

接下来是服务提供类官网:www.fhadmin.org ,PhopuRestfulService.java

 
 1 @Path("/phopuService")
 2 public class PhopuRestfulService {
 3 
 4 
 5     Logger logger = Logger.getLogger(PhopuRestfulServiceImpl.class);
 6 
 7     @GET
 8     @Produces(MediaType.APPLICATION_JSON) //指定返回数据的类型 json字符串
 9     //@Consumes(MediaType.TEXT_PLAIN) //指定请求数据的类型 文本字符串
10     @Path("/getUser/{userId}")
11     public User getUser(@PathParam("userId")String userId) {
12         this.logger.info("Call getUser() method...."+userId);
13         User user = new User();
14         user.setUserName("中文");
15         user.setAge(26);
16         user.setSex("m");
17         return user;
18     }
19 
20     @POST
21     @Produces(MediaType.APPLICATION_JSON) //指定返回数据的类型 json字符串
22     //@Consumes(MediaType.TEXT_PLAIN) //指定请求数据的类型 文本字符串
23     @Path("/getUserPost")
24     public User getUserPost(String userId) {
25         this.logger.info("Call getUserPost() method...."+userId);
26         User user = new User();
27         user.setUserName("中文");
28         user.setAge(26);
29         user.setSex("m");
30         return user;
31     }
32 }
 

web.xml配置,跟soap协议的接口一样

 
1 <!-- CXF webservice 配置 -->
2     <servlet>
3         <servlet-name>cxf-phopu</servlet-name>
4         <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
5     </servlet>
6     <servlet-mapping>
7         <servlet-name>cxf-phopu</servlet-name>
8         <url-pattern>/services/*</url-pattern>
9     </servlet-mapping>
 

Spring整合配置

 

 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xmlns:jaxrs="http://cxf.apache.org/jaxrs"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
        http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
    <import resource="classpath:/META-INF/cxf/cxf.xml" />
    <import resource="classpath:/META-INF/cxf/cxf-servlet.xml" />
    <import resource="classpath:/META-INF/cxf/cxf-extension-soap.xml" />

    <!-- 配置restful json 解析器官网:www.fhadmin.org , 用CXF自带的JSONProvider需要注意以下几点
    -1、dropRootElement 默认为false,则Json格式会将类名作为第一个节点,如{Customer:{"id":123,"name":"John"}},如果配置为true,则Json格式为{"id":123,"name":"John"}。
    -2、dropCollectionWrapperElement属性默认为false,则当遇到Collection时,Json会在集合中将容器中类名作为一个节点,比如{"Customer":{{"id":123,"name":"John"}}},而设置为false,则JSon格式为{{"id":123,"name":"John"}}
    -3、serializeAsArray属性官网:www.fhadmin.org 默认为false,则当遇到Collecion时,格式为{{"id":123,"name":"John"}},如果设置为true,则格式为[{"id":123,"name":"john"}],而Gson等解析为后者
   
    <bean id="jsonProviders" class="org.apache.cxf.jaxrs.provider.json.JSONProvider">
        <property name="dropRootElement" value="true" />
        <property name="dropCollectionWrapperElement" value="true" />
        <property name="serializeAsArray" value="true" />
    </bean>
 -->
    <!-- 服务类 -->
    <bean id="phopuService" class="com.phopu.service.PhopuRestfulService" />
    <jaxrs:server id="service"  address="/">
        <jaxrs:inInterceptors>
            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
        </jaxrs:inInterceptors>
        <!--serviceBeans:暴露的WebService服务类-->
        <jaxrs:serviceBeans>
            <ref bean="phopuService" />
        </jaxrs:serviceBeans>
        <!--支持的协议-->
        <jaxrs:extensionMappings>
            <entry key="json" value="application/json"/>
            <entry key="xml" value="application/xml" />
            <entry key="text" value="text/plain" />
        </jaxrs:extensionMappings>
        <!--对象转换-->
        <jaxrs:providers>
            <!-- <ref bean="jsonProviders" /> 这个地方直接用CXF的对象转换器会存在问题,当接口发布,第一次访问没问题,但是在访问服务就会报错,等后续在研究下 -->
            <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" />
        </jaxrs:providers>
    </jaxrs:server>
    
</beans>
 

 

客户端调用示例:

对于get方式的服务,直接在浏览器中输入 http://localhost:8080/phopu/services/phopuService/getUser/101010500 就可以直接看到返回的json字符串 

{"userName":"中文","sex":"m","age":26}

 

客户端调用代码如下:

 
 1 public static void getWeatherPostTest() throws Exception{
 2         String url = "http://localhost:8080/phopu/services/phopuService/getUserPost";
 3         HttpClient httpClient = HttpClients.createSystem();
 4         //HttpGet httpGet = new HttpGet(url);  //接口get请求,post not allowed
 5         HttpPost httpPost = new HttpPost(url);
 6         httpPost.addHeader(CONTENT_TYPE_NAME, "text/plain");
 7         StringEntity se = new StringEntity("101010500");
 8         se.setContentType("text/plain");
 9         httpPost.setEntity(se);
10         HttpResponse response = httpClient.execute(httpPost);
11 
12         int status = response.getStatusLine().getStatusCode();
13         log.info("[接口返回状态吗] : " + status);
14 
15         String weatherInfo = ClientUtil.getReturnStr(response);
16 
17         log.info("[接口返回信息] : " + weatherInfo);
18     }
 

客户端调用返回信息如下:

ClientUtil类是我自己封装的一个读取response返回信息的类,encoding是UTF-8

 

 
 1 public static String getReturnStr(HttpResponse response) throws Exception {
 2         String result = null;
 3         BufferedInputStream buffer = new BufferedInputStream(response.getEntity().getContent());
 4         byte[] bytes = new byte[1024];
 5         int line = 0;
 6         StringBuilder builder = new StringBuilder();
 7         while ((line = buffer.read(bytes)) != -1) {
 8             builder.append(new String(bytes, 0, line, HTTP_SERVER_ENCODING));
 9         }
10         result = builder.toString();
11         return result;
12     }
 

 

到这里,就介绍完了,大家手动去操作一下吧,有问题大家一块交流。

文章评论

程序员和编码员之间的区别
程序员和编码员之间的区别
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
旅行,写作,编程
旅行,写作,编程
总结2014中国互联网十大段子
总结2014中国互联网十大段子
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
每天工作4小时的程序员
每天工作4小时的程序员
一个程序员的时间管理
一个程序员的时间管理
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
程序员必看的十大电影
程序员必看的十大电影
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
代码女神横空出世
代码女神横空出世
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员的鄙视链
程序员的鄙视链
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
鲜为人知的编程真相
鲜为人知的编程真相
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
Java程序员必看电影
Java程序员必看电影
如何成为一名黑客
如何成为一名黑客
那些争议最大的编程观点
那些争议最大的编程观点
 程序员的样子
程序员的样子
老程序员的下场
老程序员的下场
我的丈夫是个程序员
我的丈夫是个程序员
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
漫画:程序员的工作
漫画:程序员的工作
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
编程语言是女人
编程语言是女人
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
10个调试和排错的小建议
10个调试和排错的小建议
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
我是如何打败拖延症的
我是如何打败拖延症的
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有