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);
}