webService-cxf框架

一、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("[email protected]");
        userMap.put(user.getUserId(), user);

        user = new User();
        user.setUserId(UUID.randomUUID().toString().replace("-", ""));
        user.setUserName("test2");
        user.setEmail("[email protected]");
        userMap.put(user.getUserId(), user);

        user = new User();
        user.setUserId(UUID.randomUUID().toString().replace("-", ""));
        user.setUserName("test3");
        user.setEmail("[email protected]");
        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;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_44132240/article/details/103616213