这里写目录标题
一、jax-ws标准(soap协议)
1、服务端
1.1依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--cxf核心依赖(必须)-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.1</version>
</dependency>
<!--jetty(必须)-->
<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>
<!--slf4j注解懒人依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</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>
1.2服务接口
package com.xsl.service;
import javax.jws.WebService;
/**
* 对外发布服务的接口
* @WebService注解标准这个接口是服务接口
*/
@WebService
public interface HelloService {
/**
* 用户传入一个名字,跟他说hello
* 发布的方法
* @param name
* @return 说的返回值
*/
public String sayHello(String name);
}
1.3服务接口实现类
package com.xsl.service.impl;
import com.xsl.service.HelloService;
/**
*实现服务接口,重写要实现的服务
*/
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "hello , "+name;
}
}
1.4发布服务
package com.xsl;
import com.xsl.service.impl.HelloServiceImpl;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
public class Server_Ws {
public static void main(String[] args) {
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
//服务的url
factory.setAddress("http://localhost:9999/ws/hello");
//设置服务类
factory.setServiceBean(new HelloServiceImpl());
//添加日志输入输出拦截器
factory.getOutInterceptors().add(new LoggingInInterceptor());
factory.getInInterceptors().add(new LoggingInInterceptor());
//发布服务
factory.create();
}
}
2、客户端调用
2.1依赖
与服务端一致
2.2服务接口
在soap协议下,jax-ws标准下我们需要有服务的服务接口,才能使用
所以我们需要将HelloServie置入我们的项目里面
2.3调用服务
package com.xsl;
import com.xsl.service.HelloService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
public class Client {
public static void main(String[] args) {
//服务接口访问地址http://localhost:9999/ws/hello
//创建cxf代理工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
//设置服务地址
factory.setAddress("http://localhost:9999/ws/hello");
//生成接口代理对象
HelloService helloService = factory.create(HelloService.class);
//访问服务端方法
String hello = helloService.sayHello("xsl");
System.out.println(hello);
}
}
二、jax-rs标准(xml/json)
1、服务端
1.1依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--cxf核心依赖-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.0.1</version>
</dependency>
<!--jetty-->
<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>
<!--slf4j懒人使用-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<!--客户端调用需要-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.0.1</version>
</dependency>
<!--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>
1.2两个实体类
(1)车类
package com.xsl.entity;
import lombok.Data;
import javax.xml.bind.annotation.XmlRootElement;
/**
* 车子
* @author xsl
*/
@Data
@XmlRootElement(name = "Car")
public class Car {
private Integer id;
private String carName;
private Double price;
}
(2)用户类
package com.xsl.entity;
import lombok.Data;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.List;
@Data
/**
* 基于restful风格的webService,客户端于服务端之间的通讯可以传递给xml数据于json数据
* @XmlRootElement 指定对象序列化为xml或者json数据时根节点的名称
* xml:
* <User>
* <id>100</id>
* <username>xsl</username>
* <city>武汉</city>
* </User>
*
* json:
* {"User":{"id":100,"username":"xsl","city":"武汉"}}
*/
@XmlRootElement(name = "User")
/**
* 人
* 一个人有若干辆车
* @author xsl
*/
public class User {
private Integer id;
private String username;
private String city;
private List<Car> cars = new ArrayList<>();
}
1.4服务接口
package com.xsl.service;
import com.xsl.entity.User;
import javax.ws.rs.*;
import java.util.List;
/**
* @Path: 给当前接口指定路由
* @Produces:
*/
@Path("/userService")
@Produces("*/*")//支持的返回的数据类型
public interface UserService {
/**
* 保存一个user
* @param user 用户实体
*/
@POST
@Path("/user")
@Consumes({"application/xml","application/json"})//支持的请求的格式
public void saveUser(User user);
/**
* 更新一个用户信息
* @param user 用户实体
*/
@PUT
@Path("/user")
@Consumes({"application/xml","application/json"})
public void updateUser(User user);
/**
* 查找所有用户
* @return 所有的user集合
*/
@GET
@Path("/user")
@Consumes({"application/xml","application/json"})
public List<User> findAllUsers();
/**
* 根据id查找用户
* @param id 用户的id
* @return 所有的user集合
*/
@GET
@Path("/user/{id}")
@Consumes({"application/xml","application/json"})
public User findUserById(@PathParam("id") Integer id);
/**
* 删除用户
* @param id 根据id删除
*/
@DELETE
@Path("/user{id}")
@Consumes({"application/xml","application/json"})
public void deleteUser(@PathParam("id") Integer id);
}
1.5服务接口实现
package com.xsl.service.impl;
import com.xsl.entity.User;
import com.xsl.service.UserService;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;
public class UserServiceImpl implements UserService {
@Override
public void saveUser(User user) {
System.out.println("save a user "+" "+ user);
}
@Override
public void updateUser(User user) {
System.out.println("update a user "+" "+ user);
}
@Override
public List<User> findAllUsers() {
List<User> userList = new ArrayList<>();
userList.add(new User());
return userList;
}
@Override
public User findUserById(Integer id) {
User user = new User();
user.setId(id);
return user;
}
@Override
public void deleteUser(Integer id) {
System.out.println("根据"+id+"删除了一个user");
}
}
1.6发布服务
package com.xsl.test;
import com.xsl.service.impl.UserServiceImpl;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
public class Server_Rs {
public static void main(String[] args) {
JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
//服务地址
factory.setAddress("http://localhost:8080/ws/");
//服务类
factory.setServiceBean(new UserServiceImpl());
//发布服务
factory.create();
System.out.println("发布成功");
}
}
2、客户端
1.1依赖
与服务端一致
1.2客户端需要两个服务端的实体类
将服务端的entity拿过来
1.3调用服务
package com.xsl.client;
import com.xsl.entity.User;
import org.apache.cxf.jaxrs.client.WebClient;
import org.junit.Test;
import javax.ws.rs.core.MediaType;
import java.util.List;
public class Client {
private static final StringBuilder BASEURL= new StringBuilder("http://localhost:8080/ws/userService/user/");
@Test
public void testPost(){
WebClient webClient = WebClient.create(new String(BASEURL));
webClient.type(MediaType.APPLICATION_JSON).post(new User());
webClient.post(new User());
}
@Test
public void testGet1(){
WebClient webClient = WebClient.create(new String(BASEURL).concat("1"));
User user = webClient.get(User.class);
}
@Test
public void testGet2(){
WebClient webClient = WebClient.create(new String(BASEURL));
List<User> userList = (List<User>)webClient.type(MediaType.APPLICATION_JSON).getCollection(User.class);
System.out.println(userList);
}
}
三、springboot整合cxf
1、依赖
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.4</version>
</dependency>
2、测试实体
package com.example.demo.entity;
import java.io.Serializable;
/**
* @ClassName:User
* @Description:测试实体
* @author xsl
* @date:2020年1月4日下午3:57:38
*/
public class User implements Serializable{
private static final long serialVersionUID = -3628469724795296287L;
private String userId;
private String userName;
private String email;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", email=" + email + "]";
}
}
3、服务接口
package com.example.demo.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import com.example.demo.entity.User;
/**
* @ClassName:UserService
* @Description:测试服务接口类
* include:两个测试方法
* @author Maple
* @date:2020年1月4日下午3:57:38
*/
@WebService
public interface UserService {
@WebMethod//标注该方法为webservice暴露的方法,用于向外公布,它修饰的方法是webservice方法,去掉也没影响的,类似一个注释信息。
public User getUser(@WebParam(name = "userId") String userId);
@WebMethod
@WebResult(name="String",targetNamespace="")
public String getUserName(@WebParam(name = "userId") String userId);
}
4、服务实现类
package com.example.demo.service.impl;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.jws.WebService;
import org.springframework.stereotype.Component;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
/**
* @ClassName:UserServiceImpl
* @Description:测试服务接口实现类
* @author xsl
* @date:2020年1月4日下午3:57:38
*/
@WebService(serviceName="UserService",//对外发布的服务名
targetNamespace="http://service.demo.example.com",//指定你想要的名称空间,通常使用使用包名反转
endpointInterface="com.example.demo.service.UserService")//服务接口全路径, 指定做SEI(Service EndPoint Interface)服务端点接口
@Component
public class UserServiceImpl implements UserService{
private Map<String, User> userMap = new HashMap<String, User>();
public UserServiceImpl() {
System.out.println("向实体类插入数据");
User user = new User();
user.setUserId(UUID.randomUUID().toString().replace("-", ""));
user.setUserName("test1");
user.setEmail("maplefix@163.xom");
userMap.put(user.getUserId(), user);
user = new User();
user.setUserId(UUID.randomUUID().toString().replace("-", ""));
user.setUserName("test2");
user.setEmail("maplefix@163.xom");
userMap.put(user.getUserId(), user);
user = new User();
user.setUserId(UUID.randomUUID().toString().replace("-", ""));
user.setUserName("test3");
user.setEmail("maplefix@163.xom");
userMap.put(user.getUserId(), user);
}
@Override
public String getUserName(String userId) {
return "userId为:" + userId;
}
@Override
public User getUser(String userId) {
System.out.println("userMap是:"+userMap);
return userMap.get(userId);
}
}
5、发布服务
package com.example.demo.config;
import javax.xml.ws.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.example.demo.service.UserService;
/**
* @ClassName:CxfConfig
* @Description:cxf发布webservice配置
* @author xsl
* @date:2020年1月4日下午3:57:38
*/
@Configuration
public class CxfConfig {
@Autowired
private Bus bus;
@Autowired
UserService userService;
/**
* 此方法作用是改变项目中服务名的前缀名,此处127.0.0.1或者localhost不能访问时,请使用ipconfig查看本机ip来访问
* 此方法被注释后:wsdl访问地址为http://127.0.0.1:8080/services/user?wsdl
* 去掉注释后:wsdl访问地址为:http://127.0.0.1:8080/soap/user?wsdl
* @return
*/
@SuppressWarnings("all")
@Bean
public ServletRegistrationBean dispatcherServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/soap/*");
}
/** JAX-WS
* 站点服务
* **/
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, userService);
endpoint.publish("/user");
return endpoint;
}
}