1. 程式人生 > >Web Service系列(六)CXF 使用 Jax-RS規範

Web Service系列(六)CXF 使用 Jax-RS規範

CXF 使用 Jax-rs規範

JAX-RS 釋出服務就是使用RESTFUL風格。

服務端

新增依賴

  1. 新增jaxrs的支援包
  2. 可以使用內建伺服器
  3. 新增基於restful風格的webService傳遞json格式相關的 支援包
  4. 注意編譯環境是1.5以上
 <dependencies>
  <!-- jaxrs 的支援包 -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxrs</artifactId
>
<version>3.0.1</version> </dependency> <!-- 內建jetty伺服器 比tomcat更輕量 沒有tomcat適用於企業那麼多高特性 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http-jetty</artifactId> <version
>
3.0.1</version> </dependency> <!-- 日誌 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <!-- 基於restful風格的webService,客戶端與服務端之間可以傳遞json,這就是json相關的支援包 -->
<dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-rs-extension-providers</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>org.codehaus.jettison</groupId> <artifactId>jettison</artifactId> <version>1.3.7</version> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> <showWarnings>true</showWarnings> </configuration> </plugin> </plugins> </pluginManagement> </build>

編寫實體類 , 服務介面和實現

實體類

  • 添加註解 @XmlRootElement 指定根元素
    • 作用:客戶端與服務端傳遞物件資料時候,
      序列化為xml或json的根元素的名稱
@XmlRootElement(name = "User")
public class User {
    private Integer id;
    private String username;
    private String city;
    ......
}
@XmlRootElement(name = "Car")
public class Car {
    private Integer id;
    private String carName;
    private Double price;
    ......
}

服務介面和實現

要點

  1. @Path(“/userService”) 註解

    • 路徑;訪問當前服務介面時候的路徑、介面方法的路徑。
  2. @POST : insert操作

  3. @PUT : update操作
  4. @GET : select 查詢操作
  5. @DELETE : delete刪除操作

  6. @Consumes : 服務端支援的請求的資料格式(xml、json)

  7. @Produces : 服務端支援的響應的資料格式
@Path("/userService")
@Produces("*/*")
public interface IUserService {

    @POST
    @Path("/user")
    @Consumes({ "application/xml", "application/json" })
    public void saveUser(User user);

    @PUT
    @Path("/user")
    @Consumes({ "application/xml", "application/json" })
    public void updateUser(User user);

    @GET
    @Path("/user")
    @Produces({ "application/xml", "application/json" })
    public List<User> findAllUsers();

    @GET
    @Path("/user/{id}")
    @Consumes("application/xml")
    @Produces({ "application/xml", "application/json" })
    public User finUserById(@PathParam("id") Integer id);

    @DELETE
    @Path("/user/{id}")
    @Consumes({"application/xml", "application/json"})
    public void deleteUser(@PathParam("id") Integer id);
}
  • 實現
public class UserServiceImpl implements IUserService {

    public void saveUser(User user) {
        System.out.println("save user:" + user);
    }

    public void updateUser(User user) {
        System.out.println("update user:" + user);
    }

    public List<User> findAllUsers() {
        List<User> users = new ArrayList<User>();
        User user1 = new User();
        user1.setId(1);
        user1.setUsername("小明");
        user1.setCity("北京");

        List<Car> carList1 = new ArrayList<Car>();
        Car car1 = new Car();
        car1.setId(101);
        car1.setCarName("保時捷");
        car1.setPrice(1000000d);
        carList1.add(car1);
        Car car2 = new Car();
        car2.setId(102);
        car2.setCarName("寶馬");
        car2.setPrice(400000d);
        carList1.add(car2);
        user1.setCars(carList1);

        users.add(user1);

        User user2 = new User();
        user2.setId(2);
        user2.setUsername("小麗");
        user2.setCity("上海");
        users.add(user2);

        return users;
    }

    public User finUserById(Integer id) {
        if (id == 1) {
            User user1 = new User();
            user1.setId(1);
            user1.setUsername("小明");
            user1.setCity("北京");
            return user1;
        }
        return null;
    }

    public void deleteUser(Integer id) {
        System.out.println("delete user id :" + id);
    }
}

釋出服務

public class App {
    public static void main(String[] args) {
        //建立服務工廠
        JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();

        //設定服務地址
        factory.setAddress("http://127.0.0.1:9999/rs/");

        //例項化服務類
        factory.setServiceBean(new UserServiceImpl());

        //新增日誌攔截器
        factory.getInInterceptors().add(new LoggingInInterceptor());
        factory.getOutInterceptors().add(new LoggingOutInterceptor());

        //釋出服務
        factory.create();
        System.out.println("JAXRS的9999服務釋出成功!!");
    }
}

客戶端

  • 新增依賴
<dependencies>
  <!-- jaxrs 的支援包 -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxrs</artifactId>
        <version>3.0.1</version>
    </dependency>

    <!-- 內建jetty伺服器 比tomcat更輕量 沒有tomcat適用於企業那麼多高特性 -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http-jetty</artifactId>
        <version>3.0.1</version>
    </dependency>
    <!-- 日誌 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.12</version>
    </dependency>
    <!-- 客戶端呼叫的時候要用 (WebClient工具類) -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-client</artifactId>
        <version>3.0.1</version>
    </dependency>

    <!-- 基於restful風格的webService,客戶端與服務端之間可以傳遞json,這就是json相關的支援包 -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-rs-extension-providers</artifactId>
        <version>3.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jettison</groupId>
        <artifactId>jettison</artifactId>
        <version>1.3.7</version>
    </dependency>

    <!-- junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>
 </dependencies>

   <build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <showWarnings>true</showWarnings>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
  </build>

實體類(不需要服務介面)

  • 添加註解 @XmlRootElement 指定根元素
    • 作用:客戶端與服務端傳遞物件資料時候,
      序列化為xml或json的根元素的名稱
@XmlRootElement(name = "User")
public class User {
    private Integer id;
    private String username;
    private String city;
    ......
}
@XmlRootElement(name = "Car")
public class Car {
    private Integer id;
    private String carName;
    private Double price;
    ......
}

遠端呼叫服務

基於RestFul風格的web service的開發的客戶端呼叫,直接通過一個類完成 WebClient

POST請求方式

POST執行的是insert操作

@Test
public void save(){
    //預設是xml資料傳遞方式  POST是增 insert操作
//      WebClient.create("http://127.0.0.1:9999/rs/userService/user")
//          .post(new User(100,"Hello","GZ"));

    //使用json格式
    WebClient.create("http://127.0.0.1:9999/rs/userService/user")
        .type(MediaType.APPLICATION_JSON)
        .post(new User(100,"Hello","GZ"));
}

image

是通過type(MediaType.APPLICATION_JSON)來指定請求的資料型別

image

PUT請求方式

PUT是執行update操作

@Test
public void update(){
    //PUT 是 update操作
//  WebClient.create("http://127.0.0.1:9999/rs/userService/user")
//      .put(new User(100,"Hello","GZ"));

    //使用json格式
    WebClient.create("http://127.0.0.1:9999/rs/userService/user")
        .type(MediaType.APPLICATION_JSON)
        .put(new User(100,"Hello","GZ"));

}

image

GET請求方式

GET 執行的是查詢操作

  • 需要在url上指定id 服務介面會自動獲取然後對映到方法引數上
    • 可看最下面的服務介面的方法的註解

也就是如果方法需要的引數可以寫在url上在對映到方法引數上

查詢單個 findOne

@Test
public void findOne(){
    //GET 是查詢操作 查詢單個需要在url上指定id 服務介面會自動獲取然後對映到方法引數上
//      User user = WebClient.create("http://127.0.0.1:9999/rs/userService/user/1")
//          .get(User.class);

    //使用json格式
    User user = WebClient.create("http://127.0.0.1:9999/rs/userService/user/1")
            //這是設定請求的資料型別
//              .type(MediaType.APPLICATION_JSON)
            //設定響應的資料型別
            .accept(MediaType.APPLICATION_JSON)
            .get(User.class);

    System.out.println(user);
}

image

通過accept(MediaType.APPLICATION_JSON)設定響應的資料型別

image

查詢多個 findAll

@Test
public void findAll(){
    //GET 是查詢操作 獲取多個使用getCollection
    Collection<? extends User> collection = WebClient.create("http://127.0.0.1:9999/rs/userService/user")
//          .accept(MediaType.APPLICATION_JSON)
        .getCollection(User.class);

    System.out.println(collection);
}

image

DELETE請求方式

DELETE 執行的是 delete操作

  • 需要在url上指定id 服務介面會自動獲取然後對映到方法引數上
    • 可看最下面的服務介面的方法的註解
@Test
public void delete(){
    //DELETE 是delete操作 需要在url上指定id 服務介面會自動獲取然後對映到方法引數上
    WebClient.create("http://127.0.0.1:9999/rs/userService/user/1")
        .delete();

}

服務的介面

@Path("/userService")
@Produces("*/*")
public interface IUserService {

    @POST
    @Path("/user")
    @Consumes({ "application/xml", "application/json" })
    public void saveUser(User user);

    @PUT
    @Path("/user")
    @Consumes({ "application/xml", "application/json" })
    public void updateUser(User user);

    @GET
    @Path("/user")
    @Produces({ "application/xml", "application/json" })
    public List<User> findAllUsers();

    @GET
    @Path("/user/{id}")
    @Consumes("application/xml")
    @Produces({ "application/xml", "application/json" })
    public User finUserById(@PathParam("id") Integer id);

    @DELETE
    @Path("/user/{id}")
    @Consumes({"application/xml", "application/json"})
    public void deleteUser(@PathParam("id") Integer id);
}