天天看點

cxf實作rest風格的webservice

開發環境:eclipse-jee-indigo-SR2-win32(3.7.2版本)、maven3.0.4、apache-tomcat-7.0.55、jdk1.7.0_67

開發技術:spring3.2.8、cxf2.7.12

項目截圖:

cxf實作rest風格的webservice
cxf實作rest風格的webservice

項目編碼:

一、pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.lessony.java</groupId>
  <artifactId>CXFServer</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>CXFServer</name>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.7</java.version>
    <spring.version>3.2.8.RELEASE</spring.version>
    <servlet-api.version>2.5</servlet-api.version>
    <slf4j.version>1.7.5</slf4j.version>
    <cxf.version>2.7.12</cxf.version>
    <jackson.version>2.1.4</jackson.version>
  </properties>

  <dependencies>
    <!-- spring begin -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-orm</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc-portlet</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- spring end -->

    <!-- @Inject begin -->
    <dependency>
      <groupId>javax.inject</groupId>
      <artifactId>javax.inject</artifactId>
      <version>1</version>
    </dependency>
    <!-- @Inject end -->
        
    <!-- servlet begin -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>${servlet-api.version}</version>
    </dependency>
    <!-- servlet end -->

    <!-- cxf begin -->
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-frontend-jaxws</artifactId>
      <version>${cxf.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-frontend-jaxrs</artifactId>
      <version>${cxf.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-rs-extension-providers</artifactId>
      <version>${cxf.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.cxf</groupId>
      <artifactId>cxf-rt-transports-http</artifactId>
      <version>${cxf.version}</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jettison</groupId>
      <artifactId>jettison</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>javax.ws.rs</groupId>
      <artifactId>jsr311-api</artifactId>
      <version>1.1.1</version>
    </dependency>
    <!-- cxf end -->

    <!-- JSON begin -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.module</groupId>
      <artifactId>jackson-module-jaxb-annotations</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.jaxrs</groupId>
      <artifactId>jackson-jaxrs-json-provider</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.0</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-core-asl</artifactId>
      <version>1.9.0</version>
    </dependency>
    <!-- JSON end -->
  </dependencies>

  <build>
    <plugins>
      <!-- compiler插件, 設定JDK版本 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.0</version>
        <configuration>
          <source>${java-version}</source>
          <target>${java-version}</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
           

二、spring配置檔案applicationContext-server.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

  <context:component-scan base-package="com.lessony.java.service.impl" />

  <import resource="classpath*:META-INF/cxf/cxf.xml" />
  <import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />
  <import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />

  <jaxrs:server id="restServiceContainer" address="/rest">
    <jaxrs:providers>
      <ref bean="jacksonProvider" />
    </jaxrs:providers>
    <jaxrs:extensionMappings>
      <entry key="json" value="application/json" />
      <entry key="xml" value="application/xml" />
    </jaxrs:extensionMappings>

    <jaxrs:serviceBeans>
      <ref bean="userServiceImpl" />
    </jaxrs:serviceBeans>

    <jaxrs:inInterceptors>
      <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
    </jaxrs:inInterceptors>
    <jaxrs:outInterceptors>
      <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
    </jaxrs:outInterceptors>
  </jaxrs:server>

  <bean id="jacksonObjectMapper"
    class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"></bean>
  <bean id="jacksonProvider"
    class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider">
    <property name="mapper" ref="jacksonObjectMapper" />
  </bean>

</beans>
           

三、web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  id="WebApp_ID" version="3.0">
  <display-name>CXFServer</display-name>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:applicationContext-server.xml
    </param-value>
  </context-param>

  <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>

  <servlet>
    <servlet-name>CXFServlet</servlet-name>
    <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>
           

二、java代碼

1、vo類(User.java、Users.java)

package com.lessony.java.vo;

import java.io.Serializable;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "UserInfo")
public class User implements Serializable {
    private static final long serialVersionUID = 677484458789332877L;
    private int id;
    private String name;
    private String email;
    private String address;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User [id=" + id + ", name=" + name + ", email=" + email
                + ", address=" + address + "]";
    }
    
    
}
           
package com.lessony.java.vo;

import java.util.List;
import java.util.Map;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "UserInfos")
public class Users {
    private List<User> users;
    private User[] userArr;
    private Map<String, User> map;
    public List<User> getUsers() {
        return users;
    }
    public void setUsers(List<User> users) {
        this.users = users;
    }
    public User[] getUserArr() {
        return userArr;
    }
    public void setUserArr(User[] userArr) {
        this.userArr = userArr;
    }
    public Map<String, User> getMap() {
        return map;
    }
    public void setMap(Map<String, User> map) {
        this.map = map;
    }
    
    
}
           

2、服務的接口類(IUserService.java):

package com.lessony.java.service;

import java.io.IOException;

import javax.ws.rs.Consumes;
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.MediaType;

import com.lessony.java.vo.User;
import com.lessony.java.vo.Users;

@Path("/user")
public interface IUserService {
    
    @GET
    @Path("/{id}")
    @Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON })
    public User getUser(@PathParam("id") int id);
    
    @GET
    @Path("/array")
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public Users getArray();
    
    @GET
    @Path("/list")
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public Users getList();
    
    @GET
    @Path("/map")
    @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    public Users getMap();
    
    @POST
    @Path("/add")
    public User postData(User user) throws IOException;
    
    @PUT
    @Path("/update/{id}")
    @Consumes(MediaType.APPLICATION_XML)
    public User putData(@PathParam("id") int id, User user);
    
    @DELETE
    @Path("/delete/{id}")
    public void deleteData(@PathParam("id") int id);
}
           
UserServiceImpl 
           

):

package com.lessony.java.service.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Named;

import com.lessony.java.service.IUserService;
import com.lessony.java.vo.User;
import com.lessony.java.vo.Users;

@Named
public class UserServiceImpl implements IUserService {

    @Override
    public User getUser(int id) {
        User user = new User();
        user.setId(id);
        user.setName("JojO");
        return user;
    }

    @Override
    public Users getArray() {
        User[] array = new User[5];
        User user = null;
        for (int i = 0; i < array.length;i ++) {
            user = new User();
            user.setId(i);
            user.setName("arrayName-" + i);
            array[i]=user;
        }
        Users users = new Users();
        users.setUserArr(array);
        return users;
    }
    
    @Override
    public Users getList() {
        List<User> list = new ArrayList<User>();
        User user = null;
        for (int i = 0; i < 4;i ++) {
            user = new User();
            user.setId(i);
            user.setName("ListName-第" + i+ "個");
            list.add(user);
        }
        Users users = new Users();
        users.setUsers(list);
        return users;
    }

    @Override
    public Users getMap() {
        Map<String, User> map = new HashMap<String, User>();
        User user = null;
        for (int i = 0; i < 4;i ++) {
            user = new User();
            user.setId(i);
            user.setName("mapName" + i);
            map.put("key-" + i, user);
        }
        Users users = new Users();
        users.setMap(map);
        return users;
    }

    @Override
    public User postData(User user) throws IOException {
     // TODO Auto-generated method stub
        return null;
    }

    @Override
    public User putData(int id, User user) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void deleteData(int id) {
        // TODO Auto-generated method stub
    }

}
           

3、接口實作類(UserServiceImpl.java):

package com.lessony.java.service.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Named;

import com.lessony.java.service.IUserService;
import com.lessony.java.vo.User;
import com.lessony.java.vo.Users;

@Named
public class UserServiceImpl implements IUserService {

    @Override
    public User getUser(int id) {
        User user = new User();
        user.setId(id);
        user.setName("JojO");
        return user;
    }

    @Override
    public Users getArray() {
        User[] array = new User[5];
        User user = null;
        for (int i = 0; i < array.length;i ++) {
            user = new User();
            user.setId(i);
            user.setName("arrayName-" + i);
            array[i]=user;
        }
        Users users = new Users();
        users.setUserArr(array);
        return users;
    }
    
    @Override
    public Users getList() {
        List<User> list = new ArrayList<User>();
        User user = null;
        for (int i = 0; i < 4;i ++) {
            user = new User();
            user.setId(i);
            user.setName("ListName-第" + i+ "個");
            list.add(user);
        }
        Users users = new Users();
        users.setUsers(list);
        return users;
    }

    @Override
    public Users getMap() {
        Map<String, User> map = new HashMap<String, User>();
        User user = null;
        for (int i = 0; i < 4;i ++) {
            user = new User();
            user.setId(i);
            user.setName("mapName" + i);
            map.put("key-" + i, user);
        }
        Users users = new Users();
        users.setMap(map);
        return users;
    }

    @Override
    public User postData(User user) throws IOException {
     // TODO Auto-generated method stub
        return null;
    }

    @Override
    public User putData(int id, User user) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void deleteData(int id) {
        // TODO Auto-generated method stub
    }

}
           

代碼全部完成。運作後,看到eclipse的内置浏覽器顯示下圖:

cxf實作rest風格的webservice

新打開一個谷歌浏覽器(不用ie的,ie的顯示不出來json),在位址欄輸入:http://localhost:8080/CXFServer/rest?_wadl

可以看到我們釋出的webservice的接口描述檔案(wadl描述):

cxf實作rest風格的webservice

在位址欄輸入:http://localhost:8080/CXFServer/rest/user/123 (預設是xml格式)

cxf實作rest風格的webservice

或者http://localhost:8080/CXFServer/rest/user/123?_type=json  (指明是傳回json格式的資料)

cxf實作rest風格的webservice

再看一個list吧,輸入:http://localhost:8080/CXFServer/rest/user/list

cxf實作rest風格的webservice

或者json格式顯示:http://localhost:8080/CXFServer/rest/user/list?_type=json  (中文有點編碼問題,其實json是utf-8格式的,怎麼設定自己解決吧)

cxf實作rest風格的webservice

完。

也許在練習過程中會遇到很多小問題,比如如何用maven建立web,如何把maven項目釋出到tomcat等網上都有這方面的文章。這裡不是重點就不涉及了。

源碼下載下傳位址:http://download.csdn.net/detail/lxn39830435731415926/7953147

繼續閱讀