spring boot 发布webservice 以及客户端

发布webservice

1.添加maven 依赖


<dependency>
    <groupId>org.apache.cxfgroupId>
    <artifactId>cxf-rt-frontend-jaxwsartifactId>
    <version>3.1.6version>
dependency>
<dependency>
    <groupId>org.apache.cxfgroupId>
    <artifactId>cxf-rt-transports-httpartifactId>
    <version>3.1.6version>
dependency>

2.添加cxf 配置类

package com.bestitu.config;

import com.bestitu.service.TestService;
import com.bestitu.service.UserService;
import com.bestitu.service.impl.TestServiceImpl;
import com.bestitu.service.impl.UserServiceImpl;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
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 org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.MultipartConfigElement;
import javax.xml.ws.Endpoint;

/**
 * cxf配置
 *
 * 访问地址
 *   http://localhost:端口/工程名称/接口名?wsdl
 *   两种方式:
 *      1) http://localhost:8050/webservice/services
 *         http://localhost:8050/webservice/services/TestService?wsdl
 *      2) http://localhost:8050/webservice/UserService?wsdl
 *
 */
@Configuration
public class CxfConfig {

    @Bean
    public ServletRegistrationBean dispatcherServlet() {
        // 使用前缀
        return new ServletRegistrationBean(new CXFServlet(), "/services/*");
        //return new ServletRegistrationBean(new CXFServlet(), "/*");
    }
    //自动注入spring boot默认的上传配置
    @Autowired
    private MultipartConfigElement multipartConfigElement;

    /**
     * 添加普通的controller处理
     * @return
     */
    @Bean
    public ServletRegistrationBean dispatcherRestServlet() {
        AnnotationConfigWebApplicationContext context
                = new AnnotationConfigWebApplicationContext();
        //替换成自己想买的controller包路径
        context.scan("com.bestitu.controller");
        DispatcherServlet disp = new DispatcherServlet(context);
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(disp);
        registrationBean.setLoadOnStartup(1);
        registrationBean.setMultipartConfig(multipartConfigElement);
        //映射路径自定义,必须设置一个不重复的名称
        registrationBean.addUrlMappings("/*");
        registrationBean.setName("rest");
        return registrationBean;
    }


    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus() {
        return new SpringBus();
    }

    @Bean
    public UserService userService() {
        return new UserServiceImpl();
    }

    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(springBus(), userService());
        endpoint.publish("/UserService");
        return endpoint;
    }


    @Bean
    public TestService testService() {
        return new TestServiceImpl();
    }

    @Bean
    public Endpoint endpointTest() {
        EndpointImpl endpoint = new EndpointImpl(springBus(), testService());
        endpoint.publish("/TestService");
        return endpoint;
    }
}

3.添加UserService 接口

import com.bestitu.model.User;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@WebService
public interface UserService {


    @WebMethod
    String getName(@WebParam(name = "userId") String userId);


    @WebMethod
    User getUser(String userId);


    @WebMethod
    User getUserInfo(User user);
}

4.添加UserService 实现类

import com.bestitu.model.User;
import com.bestitu.service.UserService;

import javax.jws.WebService;
import java.util.HashMap;
import java.util.Map;

@WebService(
        serviceName = "UserService",   // 暴露服务名称
        targetNamespace = "http://service.bestitu.com/", // 命名空间,一般是接口的包名倒序
        endpointInterface = "com.bestitu.service.UserService"  // 接口地址
)
public class UserServiceImpl implements UserService {

    private Map userMap = new HashMap();

    public UserServiceImpl() {
        //System.out.println("向实体类插入数据");
        User user = new User();
        user.setId("411001");
        user.setUsername("zhansan");
        user.setPassword("123456");
        userMap.put(user.getId(), user);

        user = new User();
        user.setId("411002");
        user.setUsername("lisi");
        user.setPassword("64513123");
        userMap.put(user.getId(), user);

        user = new User();
        user.setId("411003");
        user.setUsername("wangwu");
        user.setPassword("手动阀手动阀");
        userMap.put(user.getId(), user);
    }

    @Override
    public String getName(String userId) {
        return "liyd-" + userId;
    }

    @Override
    public User getUser(String userId) {
        System.out.println("userMap是:" + userMap);
        return userMap.get(userId);
    }

    @Override
    public User getUserInfo(User user) {
        return user;
    }

}

5.访问wsdl

访问地址
http://{ip}:{端口}/{项目名}/services
http://{ip}:{端口}/{项目名}/services/UserService?wsdl

6.访问webservice

@Test
    public void testWebService() throws Exception {
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost:8050/webservice/services/UserService?wsdl");
        Object[] objects = client.invoke("getUserInfo", "111");
        if (objects[0] != null) {
            // 转换实体类
            //输出调用结果
            User user3 = JSON.parseObject(JSON.toJSONString(objects[0]), User.class);
            System.out.println(user3.toString());
        }
        //输出调用结果
    }

你可能感兴趣的:(spring,boot)