创建REST webservice 服务端
第一步MAVEN配置
- 主要配置信息
<cxf.version>2.7.7</cxf.version>
<!-- PERSISTENCE end -->
<!-- SOAP begin -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
</dependency>
<!-- SOAP end -->
<!-- JAX-RS begin -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
</dependency>
<!-- JAX-RS end -->
第二步创建实体类
import java.io.Serializable;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
//通过注解,在网上序列号成xml或者json方式
@XmlRootElement(name = "Person")
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String desc;
@XmlElement(name = "id")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@XmlElement(name = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement(name = "desc")
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "Person [desc=" + desc + ", id=" + id + ", name=" + name + "]";
}
}
第三步创建调用接口和实现
- 接口
@Produces(MediaType.APPLICATION_JSON)
public interface IRestServiceTest extends Serializable{
@GET
@Path(value = "/person/{id}")
public Person findPersonById(@PathParam("id") String id);
@GET
@Path(value="/persons")
public String findAllPerson();
}
- 实现
public class RestServiceImpl implements IRestServiceTest{
private static final long serialVersionUID = 1L;
@Override
public Person findPersonById(String id) {
Person person = new Person();
person.setId(id);
person.setName("1");
person.setDesc("asfg");
return person;
}
@Override
public String findAllPerson() {
// TODO Auto-generated method stub
return "hello man";
}
}
CXF接口配置信息
- 主要配置信息
<!-- 配置restful方式的web服务 -->
<bean id="ps" class="com.cans.webservice.ws.server.impl.RestServiceImpl"></bean>
<jaxrs:server id="personService" address="/rest">
<jaxrs:serviceBeans>
<ref bean="ps"/>
</jaxrs:serviceBeans>
<jaxrs:providers>
<bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>
</jaxrs:providers>
</jaxrs:server>
这里有个坑
当时我在调用接口的时候报这个错误:No message body writer has been found for response class Person.
解决方法就在上面,CXF接口配置信息中最下面需要定义解析json的类;当时可是用了2个小时的时间,快疯了;
Client端
- 使用依赖
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.1.12</version>
</dependency>
- 客户端调用方法第一种
public static void main(String[] args) {
String baseAddress = "http://localhost:8077/ws/rest";
JacksonJsonProvider jsonProvider = new JacksonJsonProvider();
String productList = ClientBuilder.newClient().register(jsonProvider)
.target(baseAddress).path("/persons")
.request(MediaType.APPLICATION_JSON).get(String.class);
System.out.println(productList);
}
- 客户端调用第二种
@Test
public void clientTest() {
WebClient webClient = WebClient.create("http://localhost:8077/ws/rest").path("/person").path("1");
Response resp3 = webClient.accept(MediaType.APPLICATION_JSON).type(MediaType.APPLICATION_JSON).get();
System.out.println(resp3.getMetadata());
System.out.println(resp3.readEntity(String.class));
}