Web Service系列(六)CXF 使用 Jax-RS規範
阿新 • • 發佈:2018-12-30
CXF 使用 Jax-rs規範
JAX-RS 釋出服務就是使用RESTFUL風格。
服務端
新增依賴
- 新增jaxrs的支援包
- 可以使用內建伺服器
- 新增基於restful風格的webService傳遞json格式相關的 支援包
- 注意編譯環境是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;
......
}
服務介面和實現
要點
@Path(“/userService”) 註解
- 路徑;訪問當前服務介面時候的路徑、介面方法的路徑。
@POST : insert操作
- @PUT : update操作
- @GET : select 查詢操作
@DELETE : delete刪除操作
@Consumes : 服務端支援的請求的資料格式(xml、json)
- @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"));
}
是通過type(MediaType.APPLICATION_JSON)來指定請求的資料型別
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"));
}
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);
}
通過accept(MediaType.APPLICATION_JSON)設定響應的資料型別
查詢多個 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);
}
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);
}