zoukankan      html  css  js  c++  java
  • springboot 配置webservice接口

    导入依赖的jar

    <!-- webservice cxf -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>3.1.6</version>
        </dependency>

    创建webservice配置类

    import com.xbsafe.webservice.service.DemoService;
    import com.xbsafe.webservice.service.DemoServiceImpl;
    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.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.xml.ws.Endpoint;
    
    @Configuration
    public class CxfConfig {
    
        @Bean
        public ServletRegistrationBean dispatcherServlet() {
            ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new CXFServlet(), "/demo/*");
            servletRegistrationBean.setName("webService");
            return servletRegistrationBean;
        }
        @Bean(name = Bus.DEFAULT_BUS_ID)
        public SpringBus springBus() {
            return new SpringBus();
        }
    
        @Bean
        public DemoService demoJsonService(){
            return new DemoServiceImpl();
        }
    
        @Bean
        public Endpoint endpoint() {
            EndpointImpl endpoint = new EndpointImpl(springBus(), demoJsonService());
            endpoint.publish("/ws");
            endpoint.getInInterceptors().add(new WsInterceptor()); //add webservice inteceptor
            return endpoint;
        }
    }

    创建webservice拦截器类

    import org.apache.cxf.helpers.IOUtils;
    import org.apache.cxf.interceptor.AbstractLoggingInterceptor;
    import org.apache.cxf.interceptor.Fault;
    import org.apache.cxf.io.CachedOutputStream;
    import org.apache.cxf.io.DelegatingInputStream;
    import org.apache.cxf.message.Message;
    import org.apache.cxf.phase.Phase;
    import org.slf4j.LoggerFactory;
    
    import java.io.InputStream;
    import java.io.SequenceInputStream;
    import java.util.logging.Logger;
    
    public class WsInterceptor extends AbstractLoggingInterceptor {
        private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(WsInterceptor.class);
        public WsInterceptor() {
            super(Phase.RECEIVE);
        }
    
        @Override
        public void handleMessage(Message message) throws Fault {
            InputStream is = message.getContent(InputStream.class);
            if(is!=null){
                CachedOutputStream bos = new CachedOutputStream();
                if (threshold > 0) {
                    bos.setThreshold(threshold);
                }
                try {
                    // use the appropriate input stream and restore it later
                    InputStream bis = is instanceof DelegatingInputStream
                            ? ((DelegatingInputStream)is).getInputStream() : is;
    
    
                    //only copy up to the limit since that's all we need to log
                    //we can stream the rest
                    IOUtils.copyAtLeast(bis, bos, limit == -1 ? Integer.MAX_VALUE : limit);
                    bos.flush();
                    bis = new SequenceInputStream(bos.getInputStream(), bis);
    
                    // restore the delegating input stream or the input stream
                    if (is instanceof DelegatingInputStream) {
                        ((DelegatingInputStream)is).setInputStream(bis);
                    } else {
                        message.setContent(InputStream.class, bis);
                    }
    
                    bos.close();
                } catch (Exception e) {
                    throw new Fault(e);
                }finally{
                    LOGGER.info(bos.toString());
                }
            }
        }
    
        @Override
        protected Logger getLogger() {
            // TODO Auto-generated method stub
            return null;
        }
    }

    创建接口类(webservice的方法)

    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebService;
    
    @WebService
    public interface DemoService {
        @WebMethod
        public String test(@WebParam(name="param") String param);
    }

    接口实现类

    public class DemoServiceImpl implements DemoService {
        @Override
        public String test(String param) {
            return "webservice demo get param:"+param;
        }
    }

    测试:

    注意事项:

      springboot在配置webservice之后发现原来在controller里面写的get或post接口不能访问了,原因是springboot默认注册的是 dispatcherServlet,当

     手动配置 ServletRegistrationBean 之后便不会再去注册默认的dispatcherServlet,此时需要手动去注册一个dispatcherServlet,代码如下:

    /**
         * 注册一个dispatcherServlet,解决增加ws之后http接口访问不了问题
         */
        @Bean
        public ServletRegistrationBean restServlet(){
            //注解扫描上下文
            AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
            //base package
            applicationContext.scan("com.xbsafe");
            //通过构造函数指定dispatcherServlet的上下文
            DispatcherServlet rest_dispatcherServlet = new DispatcherServlet(applicationContext);
    
            //用ServletRegistrationBean包装servlet
            ServletRegistrationBean registrationBean = new ServletRegistrationBean(rest_dispatcherServlet);
            registrationBean.setLoadOnStartup(1);
            //指定urlmapping
            registrationBean.addUrlMappings("/*");
            //指定name,如果不指定默认为dispatcherServlet
            registrationBean.setName("rest");
            return registrationBean;
        }

    完整代码地址:https://github.com/gulang-jx/exercise/tree/master/springbootMutlDS/src/main/java/com/xbsafe/webservice

  • 相关阅读:
    转载、收藏
    AndroidStudio 问题收集
    android4.4 添加快捷开关(以截屏为例)
    打开USB调试功能
    关于Http通信
    【原创】JMS生产者和消费者【PTP同步接收消息】
    【学习】JMS通信模式
    【原创】Unable to read TLD "META-INF/c.tld" from JAR file 解决方法
    【原创】websphere部署war包报错
    【转载】tom的RUNSTATS测试工具
  • 原文地址:https://www.cnblogs.com/gulang-jx/p/9754612.html
Copyright © 2011-2022 走看看