欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

java的远程通讯的几种方法,java几种方法

来源: javaer 分享于  点击 44000 次 点评:248

java的远程通讯的几种方法,java几种方法


本文介绍了java远程通讯的几个方法
1.简单介绍了rmi及使用场景
2.简单介绍了JMS及使用场景
3.详细介绍了webservice的几个框架:axis cxf
4.restful web service简介,后续会单独说明

webservice有详细的例子,写例子时常遇到的bug,开发环境win7+JDK8+maven+intelli Idea

RMI介绍

RMI(Remote Method Invocation)为远程方法调用,是允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。 这两个虚拟机可以是运行在相同计算机上的不同进程中,也可以是运行在网络上的不同计算机中。

rmi要求客户端、服务器必须是java环境

Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。

具体请查考:

https://blog.csdn.net/xinghun_4/article/details/45787549

文档里面介绍了原理后,自己模拟了一个,写的非常好,模拟了Stub 和Skeleton

30523005]

为什么远端调用方法抛出的RemoteException异常的父类竟然是IOException呢?

这是因为,远端调用方法其实际上是通过网络IO进行的。

​ 1). 服务端定义远程访问接口;

​ 2). 服务端通过RmiServiceExporter暴露服务接口

​ 3). 客户端定义与服务端已暴露的相同接口

​ 4). 客户端通过RmiProxyFactoryBean调用服务接口

具体参考https://blog.csdn.net/a123demi/article/details/51179083

JMS 介绍

JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持(百度百科给出的概述)。我们可以简单的理解:两个应用程序之间需要进行通信,我们使用一个JMS服务,进行中间的转发,通过JMS 的使用,我们可以解除两个程序之间的耦合。

P2P的特点

如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式

默认情况下是P2P消息是持久的,也就是说发送者(sender)产生的一条消息(message)发送到消息队列(queue)之上后,只有等到消息接收者(receiver)接收到它,才会从消息队列中删除,没有被接收的消息会一直存在JMS容器里。

Pub/Sub的特点

如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

pub/sub方式下的消息不是持久的,这意味着,消息一经发出,不管有没有人接收,都不会保存下来,而且订阅者只能接收到自已订阅之后发布者发出的消息。

消息的消费

在JMS中,消息的产生和消息是异步的。对于消费来说,JMS的消息者可以通过两种方式来消费消息

○ 同步 订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞

○ 异步 订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。

我们先来看看下图,应用程序A将Message发送到服务器上,然后应用程序B从服务器中接收A发来的消息,通过这个图我们一起来分析一下JMS的好处:

1. ActiveMQ

首先简单的介绍一下MQ,MQ英文名MessageQueue,中文名也就是大家用的消息队列,干嘛用的呢,说白了就是一个消息的接受和转发的容器,可用于消息推送。

下面进入我们今天的主题,为大家介绍ActiveMQ:

ActiveMQ是由Apache出品的,一款最流行的,能力强劲的开源消息总线。ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。

2. Kafka

太复杂,不去讨论

webservice 介绍

Web service一般就是用SOAP协议通过HTTP来调用它,其实他就是一个WSDL文档,客户都可以阅读WSDL文档来用这个Web service。客户根据WSDL描述文档,会生成一个SOAP请求消息。Web service都是放在Web服务器 (如IIS) 后面的,客户生成的SOAP请求会被嵌入在一个HTTP POST请求中,发送到Web服务器来。Web服务器再把这些请求转发给Web service请求处理器。请求处理器的作用在于,解析收到的SOAP请求,调用Web service,然后再生成相应的SOAP应答。Web服务器得到SOAP应答后,会再通过HTTP应答的方式把它送回到客户端。

SOAP

WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明 HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用Web Service。

SOAP协议 = HTTP协议 + XML数据格式

SOAP协议定义了SOAP消息的格式,SOAP协议是基于HTTP协议的,SOAP也是基于XML和XSD的,XML是SOAP的数据编码方式。

soap:是http post的一个专用版本,遵循一种特殊的xml消息格式 Content-type设置为: text/xml 任何数据都可以xml化

我觉得这句话说的很对

WSDL

  好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。 WebService也一样,WebService客户端要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方 法可以调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受 的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。

  WSDL(Web Services Description Language)就是这样一个基于XML的语言,用于描述Web Service及其函数、参数和返回值。它是WebService客户端和服务器端都 能理解的标准格式。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。一些最新的开发工具既能根据你的 Web service生成WSDL文档,又能导入WSDL文档,生成调用相应WebService的代理类代码。

  WSDL 文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。 WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者

1.axis1.4版本


         //获取Service 对象-创建服务    
        Service service=new Service();  
        //通过 Service 对象获取远程调用对象Call-创建调用句柄    
        Call call=(Call) service.createCall();    
        //设置远程调用桩-设置请求地址    
                 call.setTargetEndpointAddress("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl");    
        //设置要调用的方法的名字  
        //call.setOperationName("sayHellolijing");  
        String tuser = (String) call.invoke("getSupportCity",new Object[]{"北京"});  
        System.out.println(tuser);  

访问报错

六月 04, 2018 1:57:48 下午 org.apache.axis.utils.JavaUtils isAttachmentSupported
警告: Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
Exception in thread "main" AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Client
 faultSubcode: 
 faultString: 服务器未能识别 HTTP 头 SOAPAction 的值: 。
 faultActor: 
 faultNode: 
 faultDetail: 
    {http://xml.apache.org/axis/}stackTrace:服务器未能识别 HTTP 头 SOAPAction 的值: 。
    at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
    at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
    at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2973)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:648)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:332)
    at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)

1.1.axis 讲解

1.1.1 即时发布JWS

本案例中使用的版本 :http://archive.apache.org/dist/axis/axis/java/1.4/axis-bin-1_4.zip

​ 将里面的webapps放到自己的tomcat下就是一个axis工程

再写一个java类

public class HelloJWS {

    public String sayHello(String name) {
        return "jws = " + name;
    }

}

然后修改java后缀为jws ,放到webapps/axis/的根目录下,访问

http://localhost:8090/axis/HelloJWS.jws?wsdl 即可


<wsdl:definitions xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://localhost:8090/axis/HelloJWS.jws" xmlns:intf="http://localhost:8090/axis/HelloJWS.jws" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://localhost:8090/axis/HelloJWS.jws">
<!--
WSDL created by Apache Axis version: 1.4
Built on Apr 22, 2006 (06:55:48 PDT)
-->
<wsdl:message name="sayHelloResponse">
<wsdl:part name="sayHelloReturn" type="xsd:string"/>
</wsdl:message>
<wsdl:message name="sayHelloRequest">
<wsdl:part name="name" type="xsd:string"/>
</wsdl:message>
<wsdl:portType name="HelloJWS">
<wsdl:operation name="sayHello" parameterOrder="name">
<wsdl:input message="impl:sayHelloRequest" name="sayHelloRequest"/>
<wsdl:output message="impl:sayHelloResponse" name="sayHelloResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="HelloJWSSoapBinding" type="impl:HelloJWS">
<wsdlsoap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="sayHello">
<wsdlsoap:operation soapAction=""/>
<wsdl:input name="sayHelloRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://DefaultNamespace" use="encoded"/>
</wsdl:input>
<wsdl:output name="sayHelloResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8090/axis/HelloJWS.jws" use="encoded"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="HelloJWSService">
<wsdl:port binding="impl:HelloJWSSoapBinding" name="HelloJWS">
<wsdlsoap:address location="http://localhost:8090/axis/HelloJWS.jws"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

1.1.2 定制发布

1.1.2.1 遇到的问题:

org.apache.commons.discovery.DiscoveryException: Class org.apache.commons.logging.impl.SLF4JLogFactory does not implement org.apache.commons.logging.LogFactory
    at org.apache.commons.discovery.tools.ClassUtils.verifyAncestory(ClassUtils.java:180)
    at org.apache.commons.discovery.tools.SPInterface.verifyAncestory(SPInterface.java:201)
    at org.apache.commons.discovery.tools.SPInterface.newInstance(SPInterface.java:195)
    at org.apache.commons.discovery.tools.DiscoverClass.newInstance(DiscoverClass.java:579)
    at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:418)
    at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:378)
    at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)
    at org.apache.axis.components.logger.LogFactory.<clinit>(LogFactory.java:33)
    at org.apache.axis.transport.http.AxisServletBase.<clinit>(AxisServletBase.java:58)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at java.lang.Class.newInstance(Class.java:379)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:143)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:865)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:136)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

解决问题:

要引入

   <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>1.7.22</version>
    </dependency>

这个当然也有自己的依赖包,注意依赖包是否下载下来

1.1.2.2 开发步骤

写配置预备发布 其中WEB-INF目录下的deploy.wsdd表示写入其中的配置会被发布

<deployment xmlns="http://xml.apache.org/axis/wsdd/"  
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">  

    <!-- name: 服务名随便写。 -->  
    <service name="SayHello" provider="java:RPC">  
        <parameter name="className" value="com.utrapower.server.HelloImpl" />  
        <!-- value表示哪些方法需要发布,*表示全部的public方法。 -->  
        <!-- 如果想指定方法名,方法名与方法名用逗号隔开 -->  
        <parameter name="allowedMethods" value="*" />  
        <!-- 指定命名空间 -->  
        <namespace>http://www.ztesoft.com/axis/sayHello</namespace>  
    </service>
</deployment>  

部署项目到tomcat,并且启动项目。这个时候访问 http://127.0.0.1:8080/axis/services(因为web.xml配置了这个servlet路径,

所以访问这个路径)你会发现有两个服务,AdminService 和 Version。因为我们还没有生成server-config.wsdd文件,所以只有两个

通过命令行执行命令读取deploy.wsdd生成server-config.wsdd文件发布服务。项目的WEB-INF目录下

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://127.0.0.1:8080/axis/services deploy.wsdd  

如果你看到上面两行内容,说明执行成功了。-l 后面的路径就是你在web.xml中配置的AxisServlet路径这个时候该目录下会生成

一个server-config.wsdd文件。这时访问 http://127.0.0.1:8080/axis/services。你就会发现多出来一个服务。点击SayHello的wsdl

你就可以看见服务描述了。

1.1.3 高级特性Handler&Chain

这里不做特殊说明,具体请参考https://blog.csdn.net/loveyaqin1990/article/details/52368672

Handler:

​ 有时候我们有一些特别的需求,比如当执行我们提供的服务时,希望有一些拦截动作。例如拦截一些非法的用户,或者统计下这个服务被调用了多少次等很奇怪的问题。对于这种问题一般做法就是设置拦截器。就是在执行你的服务前执行某些方法,执行之后在执行某些方法。Handler就是做这类事情的。

写的时候继承BasicHandler 就可以

然后修改server-config.wsdd文件,type里面的类路径前面需要加上前缀java

<handler name="beforeHandler" type="java:com.ztesoft.axis.ws.BeforeHandle">  
    <!-- 这里还可以设置自定义参数,在类中使用this.getOptions("someParam") 获取参数 -->  
    <parameter name="someParam" value="好好学习,天天向上" />  
</handler>  

<handler name="afterHandler" type="java:com.ztesoft.axis.ws.AfterHandler" />  

<service name="SayHello" provider="java:RPC">  
    <parameter name="allowedMethods" value="*" />  
    <parameter name="className" value="com.ztesoft.axis.ws.HelloImpl" />  
    <namespace>http://www.ztesoft.com/axis/sayHello</namespace>  
    <!-- 添加handler -->  
    <requestFlow>  
        <handler type="beforeHandler" />  
    </requestFlow>  
    <responseFlow>  
        <handler type="afterHandler" />  
    </responseFlow>  
</service>  

Chain:

​ 如果我有一连串的方法需要被调用,那该怎么办呢?将Handler一个一个的连接起来组成一个链就是chain。

步骤:

​ 1. 新建一个类继承SimpleChain。

同样也要修改配置文件

<chain name="beforeChain">  
    <handler type="java:com.ztesoft.axis.ws.BeforeChain" />  
</chain>  
<chain name="afterChain">  
    <handler type="java:com.ztesoft.axis.ws.AfterChain" />  
</chain>  
<service name="SayHello" provider="java:RPC">  
    <parameter name="allowedMethods" value="*" />  
    <parameter name="className" value="com.ztesoft.axis.ws.HelloImpl" />  
    <!-- 添加handler -->  
    <requestFlow>  
        <chain type="beforeChain" />  
    </requestFlow>  
    <responseFlow>  
        <chain type="afterChain" />  
    </responseFlow>  
</service>  

总结:
Handler与Chain只是一种拦截作用,Axis也默认提供了一些拦截的类。例如:有个Handler叫做Authenticate。

利用他可以实现用户权限控制,即调用方法的时候需要提供用户名密码,只有正确的才能调用。利用Handler和

Chain我们也可以做一些日志记录等相关内容,或者报文记录。配置在全局拦截里面,globalConfiguration节点即可

具体内容参考:

https://blog.csdn.net/loveyaqin1990/article/details/52368672

1.1.4 客户端代码


import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

/**
 * @author 作者 lijing:
 * @version 创建时间:2018-6-5 下午2:11:30
 * 类说明
 */
public class HelloClient {

    /**
     * 访问服务端的SayHello
     * @throws Exception
     */
    public static void helloImplTest() throws Exception{
        String targetEendPoint =  "http://localhost:8080/axis/services/SayHello?wsdl" ;   
        Service service =  new  Service();   
        Call call = (Call) service.createCall();   
        call.setTargetEndpointAddress( new  URL(targetEendPoint));   

        call.setOperationName( new  QName(targetEendPoint,  "getUserName" ));        
        String result = (String) call.invoke( new  Object[]{ "Robert" });   
        System.out.println(result);   
    }
    public static void main(String[] args) throws Exception{
        helloImplTest();
    }
}

2.传统的webservice

2.1 服务端

import javax.jws.WebService;
import javax.xml.ws.Endpoint;

/**
 * @author 作者 lijing:
 * @version 创建时间:2018-6-5 下午2:57:27
 * 类说明
 */
@WebService
public class TestServer {

    public String getLastName(String name){

        System.out.println("name="+name);
        return "traditional name "+name;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
         Endpoint.publish("http://localhost:8080/webService/test", new TestServer());
            System.out.println("webService pulish completed!");
    }

}

类上要加上@WebService

java application启动起来后,通过浏览器访问页面http://localhost:8080/webService/test?wsdl

2.2 客户端

打开eclise,新建项目,选择web service client,在新打开的窗口中service defination中输入 http://localhost:8080/webService/test?wsdl,finish后会看见项目中有这几个java文件,是根据wsdl文件自动生成的,

自己编写一个java测试文件

public class Test {

    public static void main(String[] args){
        TestServer test = new TestServerService().getTestServerPort();
        String name = test.getLastName("xiaochangwei");
        System.out.println(name);
    }
}

运行后就是发送一个请求

3. Apache CXF

Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,以及部署在更高级的服务器上,例如 Jboss、IBM® WebSphere® 或 BEA WebLogic

目前java主流的webService应用以CXF、AXIS2为主;

cxf优势

通过网络渠道的了解,目前CXF的效率要比AXIS2高出至少50%
另外有一个webService的工具metro的效率比CXF高出10%;
CXF的实现资料网上可以随便找出一大堆,metro的资料相对少一些;
CXFjava应用实现中已经很成熟,企业更倾向于用这样一个成熟的解决方案;

3.1 一个简单的例子

3.1.1 简单的server

写了一个简单的接口、实现类,如下:

package com.study.test.simple;
import javax.jws.WebService;
@WebService
public interface HellWorld {
    public String sayHello(String name);
}
package com.study.test.simple;
import javax.jws.WebService;
@WebService(endpointInterface = "com.study.test.simple.server.HellWorld",serviceName="HellWorld")
public class HelloWorldImpl implements HellWorld {
    @Override
    public String sayHello(String name) {
        System.out.println("sayHello方法被调用");
        return ("Hello"+name);
    }
}

然后就是启动一个webservice服务

package com.study.test.simple;

import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import javax.jws.WebService;
import javax.xml.ws.Endpoint; 
public static void main(String[] args)
    {
        //第一种发布方式:通过CXF提供的JaxWsServerFactoryBean来发布webservice
        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
        factory.setServiceClass(HellWorld.class);
        factory.setAddress("http://localhost:8091/HelloWorld");
        factory.setServiceBean(new HelloWorldImpl());//注意,这里一定要实例化
        Server server = factory.create();
        System.out.println("publish success");

        //第二种方式,通过JAX-WS提供的Endpoint来发布webservice
        //首先创建webservice服务提供类的实例
       /* HelloWorldImpl implementor = new HelloWorldImpl();
        String address = "http://localhost:8080/HelloWorld";
        Endpoint.publish(address, implementor);
        System.out.println("webService pulish completed!");*/
    }

第二种方法用java自带的JAX-WS,在上面的 2.传统的webservice 已经有介绍,不再解释,但是确认是否启动成功的时候,一定要在http://localhost:8080/HelloWorld后面加上?wsdl,不然页面是404

现在说第一种方法cxf

使用JaxWsServerFactoryBean类创建工厂设置暴露地址、接口类、接口实现类,创建即可发布 。

这里要额外加入jetty,作为webservice发布的服务器。jetty是一个内嵌的web服务器;

这个需要再pom中加上jar

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <cxf.version>3.2.5</cxf.version>
</properties>   
<dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <!-- 使用cxf内置的jetty服务器发布WebService -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>${cxf.version}</version>
        </dependency>
</dependencies>

3.1.2 简单的client

需要根据wsdl文件来生成java文件,设计到apache CXF wsdl2java工具的简单使用

1.下载apache cxf的包 ,放到本地环境D:\classpath\apache-cxf-3.2.5下

2.设置环境变量,系统变量path下增加:D:\classpath\apache-cxf-3.2.5\bin

3.apache-cxf-3.2.5版本要求是jdk8以上包含8,所以如果jdk版本不对,也要修改

4.运行wsdl2java工具

在cmd命令中输入:

wsdl2java -d E:\study\test\cxfClientTest\src\main\java -client http://localhost:8091/HelloWorld?wsdl

然后查看E:\study\test\cxfClientTest\src\main\java里面多了

编写客户端代码:

import com.study.test.simple.server.HellWorld;
import com.study.test.simple.server.HellWorldService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
/**
 * Created by Administrator on 2018/7/18.
 */
public class MainClient {
    public static void main(String[] arg){
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(HellWorld.class);
        factory.setAddress("http://localhost:8091/HelloWorld?wsdl");
        HellWorld helloworld = (HellWorld) factory.create();
        System.out.println(helloworld.sayHello("outofmemory.cn"));
    }
}

3.2 一个复杂的例子

3.2.1 复杂的server

  • Spring boot 1.4.x ——>cxf-spring-boot-starter-jaxws 3.1.x
  • Spring boot 1.5.x——->cxf-spring-boot-starter-jaxws 3.2.x

且用了spring boot 1.5.x的小伙伴请将cxf-spring-boot-starter-jaxws 版本升级到3.2.1。

不多说,上代码

package com.complex;

import com.complex.bean.User;
import org.springframework.stereotype.Component;

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

/**
 * Created by Administrator on 2018/7/19.
 */
@WebService(name="UserService",targetNamespace="http://complex.com/")
@Component
public interface UserService {
    @WebMethod
    String getName(@WebParam(name = "userId") String userId);

    @WebMethod
    User getUser(String userId);
}
package com.complex;

import com.complex.bean.User;
import org.springframework.stereotype.Component;

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

/**
 * Created by Administrator on 2018/7/19.
 */
@WebService(serviceName = "UserService",targetNamespace="http://complex.com/", endpointInterface = "com.complex.UserService")
@Component("aaa")
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("411001");
        user.setUsername("zhansan");
        user.setAge("20");
        user.setUpdateTime(new Date());
        userMap.put(user.getUserId(), user);

        user = new User();
        user.setUserId("411002");
        user.setUsername("lisi");
        user.setAge("30");
        user.setUpdateTime(new Date());
        userMap.put(user.getUserId(), user);

        user = new User();
        user.setUserId("411003");
        user.setUsername("wangwu");
        user.setAge("40");
        user.setUpdateTime(new Date());
        userMap.put(user.getUserId(), 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);
    }
}
package com.complex;

import javax.xml.ws.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * Created by Administrator on 2018/7/19.
 */
@Configuration
public class TestConfig {
     @Autowired
    private Bus bus;

    @Autowired
    public UserService aaa;

    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(bus, aaa);
        endpoint.publish("/UserService");//接口发布在 /NetbarServices 目录下
        return endpoint;
    }


}
package com.complex;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Created by Administrator on 2018/7/20.
 */
@SpringBootApplication
public class mainServer {
    public static void main(String[] args) {
        SpringApplication.run(mainServer.class, args);
    }
}

对应的pom

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
            <scope>true</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>3.1.12</version>
        </dependency>
    </dependencies>

注意事项

1.测试例子是spring boot,所以要求启动方法对应的类在说有类的前面,

SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!“Application类”是指SpringBoot项目入口类。这个类的位置很关键:如果Application类所在的包为:com.boot.app,则只会扫描com.boot.app包及其所有子包,如果service或dao所在包不在com.boot.app及其子包下,则不会被扫描!即, 把Application类放到dao、service所在包的上级,com.boot.Application知道这一点非常关键

2.cxf spring boot官网例子

http://cxf.apache.org/docs/springboot.html

url:http://localhost:8080/services/UserService?wsdl

3.2.2 client

客户端代码比较简单,pom文件和server端一样

 @Test
    public void cl2() {
        // 创建动态客户端
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient("http://localhost:8080/services/UserService?wsdl");
        // 需要密码的情况需要加上用户名和密码
        // client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,
        // PASS_WORD));
        Object[] objects = new Object[0];
        try {
            // invoke("方法名",参数1,参数2,参数3....);
            //objects = client.invoke("getName", "Leftso");
            objects = client.invoke("getUser", "411001");

            System.out.println("返回数据:" + objects[0]);
        } catch (java.lang.Exception e) {
            e.printStackTrace();
        }
    }

客户端有两种实现方式,第二种

具体com.complex.User UserService两个类 需要根据命令:wsdl2java -d E:\study\test\cxfComplexClient\src\main\java -client http://localhost:8080/services/UserService?wsdl

自动生成,具体请看上面的简单的client

 @Test
    public void cl1() {
        try {
            // 接口地址
            String address = "http://localhost:8080/services/UserService?wsdl";
            // 代理工厂
            JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
            // 设置代理地址
            jaxWsProxyFactoryBean.setAddress(address);
            // 设置接口类型
            jaxWsProxyFactoryBean.setServiceClass(UserService.class);
            // 创建一个代理接口实现
            UserService cs = (UserService) jaxWsProxyFactoryBean.create();
            // 数据准备
            String userName = "411001";
            // 调用代理接口的方法调用并返回结果
            com.complex.User user = cs.getUser(userName);
            System.out.println("返回结果:" + user.getUsername()+user.getUpdateTime());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.3 遇到的问题

3.3.1 idea下遇到的问题jetty问题

启动webservice的时候,还是报错

16:45:21.658 [main] DEBUG org.apache.cxf.resource.DefaultResourceManager - resolving resource <org.apache.cxf.wsdl11.WSDLManagerImpl/bus> type <interface org.apache.cxf.Bus>
16:45:21.659 [main] DEBUG org.apache.cxf.resource.DefaultResourceManager - resolving resource <null> type <interface org.apache.cxf.Bus>
Exception in thread "main" org.apache.cxf.service.factory.ServiceConstructionException

15:29:06.067 [main] ERROR org.apache.cxf.transport.http.HTTPTransportFactory - Cannot find any registered HttpDestinationFactory from the Bus.
Exception in thread "main" org.apache.cxf.service.factory.ServiceConstructionException
    at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:197)
    at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:211)
    at com.study.test.simple.MainServer.main(MainServer.java:21)
...

查资料后,发现需要加jar包

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>3.1.8</version>
        </dependency>

然后又报错。。。。太不顺啦,看其它资料,并没有关于这方面的说明

16:53:05.229 [main] DEBUG org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory - Creating Jetty HTTP Server Engine for port 8080.
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/jetty/server/SessionManager
    at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory.getOrCreate(JettyHTTPServerEngineFactory.java:117)
    at org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory.createJettyHTTPServerEngine(JettyHTTPServerEngineFactory.java:273)

        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-server</artifactId>
            <version>9.4.11.v20180605</version>
        </dependency>

还是搞不定,依然没有找到org.eclipse.jetty.server.SessionManager

从idea 切换到eclipse,启动成功

http://localhost:8091/HelloWorld?wsdl

为什么eclipse下就不报错,idea 会报错呢,那么idea 如何不报错呢?

jetty-maven-plugin
这种方式使用的是CXF内置的服务器jetty非常容易测试和调试,大大提高了开发效率,但是不适合生产环境,所以我们需要会和spring,tomcat结合.

继续找资料

http://www.java2s.com/Code/Jar/o/Downloadorgeclipsejettyserverjar.htm

里面记录的org.eclipse.jetty.server.jar中有SessionManager,而我通过maven下载的org.eclipse.jetty中没有

SessionManager,而是有SessionIdManager

两者少了我要找的类,查看他们的.mf文件,发现版本不一样,maven下载的版本更新2018年,也就是之前的版本是有sessionManager,现在的版本已经不需要啦,让我想起cxf引用的版本都是3.1.8,可能不是最新的版本

用旧版本的cxf,引用新版本的org/eclipse/jetty导致了不兼容问题。

查看maven

修改我的pom.xml文件

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <cxf.version>3.2.5</cxf.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>



        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <!-- 使用cxf内置的jetty服务器发布WebService -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>${cxf.version}</version>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

重新启动main方法,启动成功。

D:\programfile\Java\jdk1.8.0_151\bin\java -Didea.launcher.port=7533 -Didea.launcher.bin.path=D:\programfile\IDEA15\bin -Dfile.encoding=UTF-8 -classpath D:\programfile\Java\jdk1.8.0_151\jre\lib\charsets.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\deploy.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\dnsns.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\jaccess.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\localedata.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\nashorn.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\sunec.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\ext\zipfs.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\javaws.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\jce.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\jfr.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\jfxswt.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\jsse.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\management-agent.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\plugin.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\resources.jar;D:\programfile\Java\jdk1.8.0_151\jre\lib\rt.jar;E:\study\test\cxfTest\target\classes;E:\study\apache-maven-3.5.3\jar\org\springframework\boot\spring-boot-starter-web\2.0.3.RELEASE\spring-boot-starter-web-2.0.3.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\boot\spring-boot-starter\2.0.3.RELEASE\spring-boot-starter-2.0.3.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\boot\spring-boot\2.0.3.RELEASE\spring-boot-2.0.3.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\boot\spring-boot-autoconfigure\2.0.3.RELEASE\spring-boot-autoconfigure-2.0.3.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\boot\spring-boot-starter-logging\2.0.3.RELEASE\spring-boot-starter-logging-2.0.3.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;E:\study\apache-maven-3.5.3\jar\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;E:\study\apache-maven-3.5.3\jar\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;E:\study\apache-maven-3.5.3\jar\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;E:\study\apache-maven-3.5.3\jar\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;E:\study\apache-maven-3.5.3\jar\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;E:\study\apache-maven-3.5.3\jar\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\boot\spring-boot-starter-json\2.0.3.RELEASE\spring-boot-starter-json-2.0.3.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\com\fasterxml\jackson\core\jackson-databind\2.9.6\jackson-databind-2.9.6.jar;E:\study\apache-maven-3.5.3\jar\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;E:\study\apache-maven-3.5.3\jar\com\fasterxml\jackson\core\jackson-core\2.9.6\jackson-core-2.9.6.jar;E:\study\apache-maven-3.5.3\jar\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.6\jackson-datatype-jdk8-2.9.6.jar;E:\study\apache-maven-3.5.3\jar\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.6\jackson-datatype-jsr310-2.9.6.jar;E:\study\apache-maven-3.5.3\jar\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.6\jackson-module-parameter-names-2.9.6.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\boot\spring-boot-starter-tomcat\2.0.3.RELEASE\spring-boot-starter-tomcat-2.0.3.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\apache\tomcat\embed\tomcat-embed-core\8.5.31\tomcat-embed-core-8.5.31.jar;E:\study\apache-maven-3.5.3\jar\org\apache\tomcat\embed\tomcat-embed-el\8.5.31\tomcat-embed-el-8.5.31.jar;E:\study\apache-maven-3.5.3\jar\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.31\tomcat-embed-websocket-8.5.31.jar;E:\study\apache-maven-3.5.3\jar\org\hibernate\validator\hibernate-validator\6.0.10.Final\hibernate-validator-6.0.10.Final.jar;E:\study\apache-maven-3.5.3\jar\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;E:\study\apache-maven-3.5.3\jar\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;E:\study\apache-maven-3.5.3\jar\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\spring-web\5.0.7.RELEASE\spring-web-5.0.7.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\spring-beans\5.0.7.RELEASE\spring-beans-5.0.7.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\spring-webmvc\5.0.7.RELEASE\spring-webmvc-5.0.7.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\spring-aop\5.0.7.RELEASE\spring-aop-5.0.7.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\spring-context\5.0.7.RELEASE\spring-context-5.0.7.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\spring-expression\5.0.7.RELEASE\spring-expression-5.0.7.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\boot\spring-boot-starter-web-services\2.0.3.RELEASE\spring-boot-starter-web-services-2.0.3.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\spring-oxm\5.0.7.RELEASE\spring-oxm-5.0.7.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\ws\spring-ws-core\3.0.1.RELEASE\spring-ws-core-3.0.1.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\ws\spring-xml\3.0.1.RELEASE\spring-xml-3.0.1.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\commons-io\commons-io\2.5\commons-io-2.5.jar;E:\study\apache-maven-3.5.3\jar\org\apache\cxf\cxf-rt-frontend-jaxws\3.2.5\cxf-rt-frontend-jaxws-3.2.5.jar;E:\study\apache-maven-3.5.3\jar\xml-resolver\xml-resolver\1.2\xml-resolver-1.2.jar;E:\study\apache-maven-3.5.3\jar\org\ow2\asm\asm\5.2\asm-5.2.jar;E:\study\apache-maven-3.5.3\jar\org\apache\cxf\cxf-core\3.2.5\cxf-core-3.2.5.jar;E:\study\apache-maven-3.5.3\jar\com\fasterxml\woodstox\woodstox-core\5.0.3\woodstox-core-5.0.3.jar;E:\study\apache-maven-3.5.3\jar\org\codehaus\woodstox\stax2-api\3.1.4\stax2-api-3.1.4.jar;E:\study\apache-maven-3.5.3\jar\org\apache\ws\xmlschema\xmlschema-core\2.2.3\xmlschema-core-2.2.3.jar;E:\study\apache-maven-3.5.3\jar\org\apache\cxf\cxf-rt-bindings-soap\3.2.5\cxf-rt-bindings-soap-3.2.5.jar;E:\study\apache-maven-3.5.3\jar\org\apache\cxf\cxf-rt-wsdl\3.2.5\cxf-rt-wsdl-3.2.5.jar;E:\study\apache-maven-3.5.3\jar\wsdl4j\wsdl4j\1.6.3\wsdl4j-1.6.3.jar;E:\study\apache-maven-3.5.3\jar\org\apache\cxf\cxf-rt-databinding-jaxb\3.2.5\cxf-rt-databinding-jaxb-3.2.5.jar;E:\study\apache-maven-3.5.3\jar\org\apache\cxf\cxf-rt-bindings-xml\3.2.5\cxf-rt-bindings-xml-3.2.5.jar;E:\study\apache-maven-3.5.3\jar\org\apache\cxf\cxf-rt-frontend-simple\3.2.5\cxf-rt-frontend-simple-3.2.5.jar;E:\study\apache-maven-3.5.3\jar\org\apache\cxf\cxf-rt-ws-addr\3.2.5\cxf-rt-ws-addr-3.2.5.jar;E:\study\apache-maven-3.5.3\jar\org\apache\cxf\cxf-rt-ws-policy\3.2.5\cxf-rt-ws-policy-3.2.5.jar;E:\study\apache-maven-3.5.3\jar\org\apache\neethi\neethi\3.1.1\neethi-3.1.1.jar;E:\study\apache-maven-3.5.3\jar\org\apache\cxf\cxf-rt-transports-http\3.2.5\cxf-rt-transports-http-3.2.5.jar;E:\study\apache-maven-3.5.3\jar\org\apache\cxf\cxf-rt-transports-http-jetty\3.2.5\cxf-rt-transports-http-jetty-3.2.5.jar;E:\study\apache-maven-3.5.3\jar\org\eclipse\jetty\jetty-server\9.4.11.v20180605\jetty-server-9.4.11.v20180605.jar;E:\study\apache-maven-3.5.3\jar\javax\servlet\javax.servlet-api\3.1.0\javax.servlet-api-3.1.0.jar;E:\study\apache-maven-3.5.3\jar\org\eclipse\jetty\jetty-util\9.4.11.v20180605\jetty-util-9.4.11.v20180605.jar;E:\study\apache-maven-3.5.3\jar\org\eclipse\jetty\jetty-io\9.4.11.v20180605\jetty-io-9.4.11.v20180605.jar;E:\study\apache-maven-3.5.3\jar\org\eclipse\jetty\jetty-security\9.4.11.v20180605\jetty-security-9.4.11.v20180605.jar;E:\study\apache-maven-3.5.3\jar\org\eclipse\jetty\jetty-continuation\9.4.11.v20180605\jetty-continuation-9.4.11.v20180605.jar;E:\study\apache-maven-3.5.3\jar\org\eclipse\jetty\jetty-http\9.4.11.v20180605\jetty-http-9.4.11.v20180605.jar;E:\study\apache-maven-3.5.3\jar\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\spring-core\5.0.7.RELEASE\spring-core-5.0.7.RELEASE.jar;E:\study\apache-maven-3.5.3\jar\org\springframework\spring-jcl\5.0.7.RELEASE\spring-jcl-5.0.7.RELEASE.jar;D:\programfile\IDEA15\lib\idea_rt.jar com.intellij.rt.execution.application.AppMain com.study.test.simple.MainServer
14:22:11.017 [main] DEBUG org.apache.cxf.common.logging.LogUtils - Using org.apache.cxf.common.logging.Slf4jLogger for logging.
14:22:11.334 [main] INFO org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean - Creating Service {http://simple.test.study.com/}HellWorldService from class com.study.test.simple.HellWorld
14:22:11.729 [main] DEBUG org.apache.cxf.jaxb.JAXBDataBinding - Created JAXBContext "jar:file:/D:/programfile/Java/jdk1.8.0_151/jre/lib/rt.jar!/com/sun/xml/internal/bind/v2/runtime/JAXBContextImpl.class Build-Id: 1.8.0_151
Classes known to this context:
  [B
  boolean
  byte
  char
  com.study.test.simple.jaxws_asm.SayHello
  com.study.test.simple.jaxws_asm.SayHelloResponse
  com.sun.xml.internal.bind.api.CompositeStructure
  double
  float
  int
  java.awt.Image
  java.io.File
  java.lang.Boolean
  java.lang.Byte
  java.lang.Character
  java.lang.Class
  java.lang.Double
  java.lang.Float
  java.lang.Integer
  java.lang.Long
  java.lang.Object
  java.lang.Short
  java.lang.String
  java.lang.Void
  java.math.BigDecimal
  java.math.BigInteger
  java.net.URI
  java.net.URL
  java.util.Calendar
  java.util.Date
  java.util.GregorianCalendar
  java.util.UUID
  javax.activation.DataHandler
  javax.xml.bind.JAXBElement
  javax.xml.datatype.Duration
  javax.xml.datatype.XMLGregorianCalendar
  javax.xml.namespace.QName
  javax.xml.transform.Source
  long
  short
  void
" with classes [class com.study.test.simple.jaxws_asm.SayHello, class com.study.test.simple.jaxws_asm.SayHelloResponse].
14:22:11.734 [main] DEBUG org.apache.cxf.common.jaxb.JAXBUtils - Failed to create NoEscapeHandler
14:22:11.915 [main] DEBUG org.apache.cxf.resource.DefaultResourceManager - resolving resource <org.apache.cxf.wsdl11.WSDLManagerImpl/bus> type <interface org.apache.cxf.Bus>
14:22:11.917 [main] DEBUG org.apache.cxf.resource.DefaultResourceManager - resolving resource <null> type <interface org.apache.cxf.Bus>
14:22:12.171 [main] DEBUG org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory - Creating Jetty HTTP Server Engine for port 8091.
14:22:12.274 [main] DEBUG org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine - Configured port 8091 for "http".
14:22:12.274 [main] INFO org.apache.cxf.endpoint.ServerImpl - Setting the server's publish address to be http://localhost:8091/HelloWorld
14:22:12.283 [main] DEBUG org.apache.cxf.endpoint.ServerImpl - Server is starting.
14:22:12.285 [main] DEBUG org.apache.cxf.transport.http_jetty.JettyHTTPDestination - registering incoming observer: org.apache.cxf.transport.ChainInitiationObserver@68267da0
14:22:12.285 [main] DEBUG org.apache.cxf.transport.http_jetty.JettyHTTPDestination - Activating receipt of incoming messages
14:22:12.296 [main] DEBUG org.eclipse.jetty.util.log - Logging to Logger[org.eclipse.jetty.util.log] via org.eclipse.jetty.util.log.Slf4jLog
14:22:12.321 [main] INFO org.eclipse.jetty.util.log - Logging initialized @1902ms to org.eclipse.jetty.util.log.Slf4jLog
14:22:12.367 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - org.eclipse.jetty.server.Server@2beee7ff[9.4.11.v20180605] added {QueuedThreadPool[qtp2030036700]@78ffe6dc{STOPPED,8<=0<=200,i=0,q=0}[org.eclipse.jetty.util.thread.TryExecutor$$Lambda$3/1600667055@1f97cf0d],AUTO}
14:22:12.369 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - org.eclipse.jetty.server.Server@2beee7ff[9.4.11.v20180605] added {org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine$1@77eca502,AUTO}
14:22:12.422 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - HttpConnectionFactory@a2431d0[HTTP/1.1] added {HttpConfiguration@1cbb87f3{32768/8192,8192/8192,https://:0,[]},POJO}
14:22:12.433 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - HttpConnectionFactory@57af006c[HTTP/1.1] added {HttpConfiguration@6bedbc4d{32768/8192,8192/8192,https://:0,[]},POJO}
14:22:12.437 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - ServerConnector@15aab8c6{null,[]}{0.0.0.0:0} added {org.eclipse.jetty.server.Server@2beee7ff[9.4.11.v20180605],UNMANAGED}
14:22:12.438 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - ServerConnector@15aab8c6{null,[]}{0.0.0.0:0} added {QueuedThreadPool[qtp2030036700]@78ffe6dc{STOPPED,8<=0<=200,i=0,q=0}[org.eclipse.jetty.util.thread.TryExecutor$$Lambda$3/1600667055@1f97cf0d],AUTO}
14:22:12.438 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - ServerConnector@15aab8c6{null,[]}{0.0.0.0:0} added {org.eclipse.jetty.util.thread.ScheduledExecutorScheduler@3514a4c0,AUTO}
14:22:12.438 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - ServerConnector@15aab8c6{null,[]}{0.0.0.0:0} added {org.eclipse.jetty.io.ArrayByteBufferPool@33990a0c,POJO}
14:22:12.439 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - ServerConnector@15aab8c6{null,[http/1.1]}{0.0.0.0:0} added {HttpConnectionFactory@57af006c[HTTP/1.1],AUTO}
14:22:12.439 [main] DEBUG org.eclipse.jetty.server.AbstractConnector - ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{0.0.0.0:0} added HttpConnectionFactory@57af006c[HTTP/1.1]
14:22:12.448 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{0.0.0.0:0} added {SelectorManager@ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{0.0.0.0:0},MANAGED}
14:22:12.449 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{0.0.0.0:0} added {HttpConnectionFactory@a2431d0[HTTP/1.1],AUTO}
14:22:12.449 [main] DEBUG org.eclipse.jetty.server.AbstractConnector - ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{0.0.0.0:0} added HttpConnectionFactory@a2431d0[HTTP/1.1]
14:22:12.450 [main] DEBUG org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine - "localhost"
14:22:12.450 [main] DEBUG org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine - connector.port: 8091
14:22:12.450 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - org.eclipse.jetty.server.Server@2beee7ff[9.4.11.v20180605] added {ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{localhost:8091},AUTO}
14:22:12.450 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - org.eclipse.jetty.server.Server@2beee7ff[9.4.11.v20180605] added {org.eclipse.jetty.server.handler.ContextHandlerCollection@2b48a640[],MANAGED}
14:22:12.451 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting org.eclipse.jetty.server.Server@2beee7ff[9.4.11.v20180605]
14:22:12.453 [main] INFO org.eclipse.jetty.server.Server - jetty-9.4.11.v20180605; built: 2018-06-05T18:24:03.829Z; git: d5fc0523cfa96bfebfbda19606cad384d772f04c; jvm 1.8.0_151-b12
14:22:12.469 [main] DEBUG org.eclipse.jetty.server.handler.AbstractHandler - starting org.eclipse.jetty.server.Server@2beee7ff[9.4.11.v20180605]
14:22:12.469 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting QueuedThreadPool[qtp2030036700]@78ffe6dc{STOPPED,8<=0<=200,i=0,q=0}[org.eclipse.jetty.util.thread.TryExecutor$$Lambda$3/1600667055@1f97cf0d]
14:22:12.472 [main] DEBUG org.eclipse.jetty.util.thread.ReservedThreadExecutor - ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}
14:22:12.473 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTING,8<=0<=200,i=0,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}] added {ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0},AUTO}
14:22:12.473 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}
14:22:12.487 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2084ms ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}
14:22:12.495 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2087ms QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=0,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}]
14:22:12.495 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine$1@77eca502
14:22:12.495 [main] DEBUG org.eclipse.jetty.server.handler.AbstractHandler - starting org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine$1@77eca502
14:22:12.495 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2094ms org.apache.cxf.transport.http_jetty.JettyHTTPServerEngine$1@77eca502
14:22:12.495 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting org.eclipse.jetty.server.handler.ContextHandlerCollection@2b48a640[]
14:22:12.495 [main] DEBUG org.eclipse.jetty.server.handler.AbstractHandler - starting org.eclipse.jetty.server.handler.ContextHandlerCollection@2b48a640[]
14:22:12.496 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2094ms org.eclipse.jetty.server.handler.ContextHandlerCollection@2b48a640[]
14:22:12.496 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{localhost:8091}
14:22:12.519 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{localhost:8091} added {sun.nio.ch.ServerSocketChannelImpl[/127.0.0.1:8091],POJO}
14:22:12.520 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting org.eclipse.jetty.util.thread.ScheduledExecutorScheduler@3514a4c0
14:22:12.523 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2122ms org.eclipse.jetty.util.thread.ScheduledExecutorScheduler@3514a4c0
14:22:12.524 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting SelectorManager@ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{localhost:8091}
14:22:12.548 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - EatWhatYouKill@2f217633/SelectorProducer@5d7148e2/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.54+08:00 added {SelectorProducer@5d7148e2,POJO}
14:22:12.549 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - EatWhatYouKill@2f217633/SelectorProducer@5d7148e2/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.549+08:00 added {QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}],UNMANAGED}
14:22:12.550 [main] DEBUG org.eclipse.jetty.util.thread.strategy.EatWhatYouKill - EatWhatYouKill@2f217633/SelectorProducer@5d7148e2/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.55+08:00 created
14:22:12.551 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - org.eclipse.jetty.io.ManagedSelector@bae7dc0 id=0 keys=-1 selected=-1 updates=0 added {EatWhatYouKill@2f217633/SelectorProducer@5d7148e2/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.551+08:00,MANAGED}
14:22:12.552 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - SelectorManager@ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{localhost:8091} added {org.eclipse.jetty.io.ManagedSelector@bae7dc0 id=0 keys=-1 selected=-1 updates=0,AUTO}
14:22:12.552 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - EatWhatYouKill@209da20d/SelectorProducer@e15b7e8/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.552+08:00 added {SelectorProducer@e15b7e8,POJO}
14:22:12.553 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - EatWhatYouKill@209da20d/SelectorProducer@e15b7e8/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.553+08:00 added {QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}],UNMANAGED}
14:22:12.554 [main] DEBUG org.eclipse.jetty.util.thread.strategy.EatWhatYouKill - EatWhatYouKill@209da20d/SelectorProducer@e15b7e8/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.553+08:00 created
14:22:12.556 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - org.eclipse.jetty.io.ManagedSelector@1b2abca6 id=1 keys=-1 selected=-1 updates=0 added {EatWhatYouKill@209da20d/SelectorProducer@e15b7e8/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.556+08:00,MANAGED}
14:22:12.557 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - SelectorManager@ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{localhost:8091} added {org.eclipse.jetty.io.ManagedSelector@1b2abca6 id=1 keys=-1 selected=-1 updates=0,AUTO}
14:22:12.557 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting org.eclipse.jetty.io.ManagedSelector@bae7dc0 id=0 keys=-1 selected=-1 updates=0
14:22:12.557 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting EatWhatYouKill@2f217633/SelectorProducer@5d7148e2/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.557+08:00
14:22:12.558 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2156ms EatWhatYouKill@2f217633/SelectorProducer@5d7148e2/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=8,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.558+08:00
14:22:12.763 [main] DEBUG org.eclipse.jetty.util.thread.QueuedThreadPool - queue org.eclipse.jetty.io.ManagedSelector$$Lambda$21/1022081840@12aba8be
14:22:12.763 [qtp2030036700-14] DEBUG org.eclipse.jetty.util.thread.QueuedThreadPool - run org.eclipse.jetty.io.ManagedSelector$$Lambda$21/1022081840@12aba8be
14:22:12.764 [qtp2030036700-14] DEBUG org.eclipse.jetty.util.thread.strategy.EatWhatYouKill - EatWhatYouKill@2f217633/SelectorProducer@5d7148e2/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=7,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.763+08:00 tryProduce false
14:22:12.764 [main] DEBUG org.eclipse.jetty.io.ManagedSelector - Queued change org.eclipse.jetty.io.ManagedSelector$$Lambda$22/1906879951@27462a88 on org.eclipse.jetty.io.ManagedSelector@bae7dc0 id=0 keys=0 selected=0 updates=0
14:22:12.764 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2362ms org.eclipse.jetty.io.ManagedSelector@bae7dc0 id=0 keys=0 selected=0 updates=1
14:22:12.764 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting org.eclipse.jetty.io.ManagedSelector@1b2abca6 id=1 keys=-1 selected=-1 updates=0
14:22:12.765 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting EatWhatYouKill@209da20d/SelectorProducer@e15b7e8/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=7,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.764+08:00
14:22:12.765 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2363ms EatWhatYouKill@209da20d/SelectorProducer@e15b7e8/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=7,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.765+08:00
14:22:12.766 [qtp2030036700-14] DEBUG org.eclipse.jetty.io.ManagedSelector - updateable 1
14:22:12.766 [qtp2030036700-14] DEBUG org.eclipse.jetty.io.ManagedSelector - update org.eclipse.jetty.io.ManagedSelector$$Lambda$22/1906879951@27462a88
14:22:12.767 [qtp2030036700-14] DEBUG org.eclipse.jetty.io.ManagedSelector - updates 0
14:22:12.767 [qtp2030036700-14] DEBUG org.eclipse.jetty.io.ManagedSelector - Selector sun.nio.ch.WindowsSelectorImpl@3e55e921 waiting with 0 keys
14:22:12.768 [main] DEBUG org.eclipse.jetty.util.thread.QueuedThreadPool - queue org.eclipse.jetty.io.ManagedSelector$$Lambda$21/1022081840@82de64a
14:22:12.769 [main] DEBUG org.eclipse.jetty.io.ManagedSelector - Queued change org.eclipse.jetty.io.ManagedSelector$$Lambda$22/1906879951@659499f1 on org.eclipse.jetty.io.ManagedSelector@1b2abca6 id=1 keys=0 selected=0 updates=0
14:22:12.769 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2367ms org.eclipse.jetty.io.ManagedSelector@1b2abca6 id=1 keys=0 selected=0 updates=1
14:22:12.769 [qtp2030036700-18] DEBUG org.eclipse.jetty.util.thread.QueuedThreadPool - run org.eclipse.jetty.io.ManagedSelector$$Lambda$21/1022081840@82de64a
14:22:12.769 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2367ms SelectorManager@ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{localhost:8091}
14:22:12.769 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting HttpConnectionFactory@a2431d0[HTTP/1.1]
14:22:12.769 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2368ms HttpConnectionFactory@a2431d0[HTTP/1.1]
14:22:12.769 [qtp2030036700-18] DEBUG org.eclipse.jetty.util.thread.strategy.EatWhatYouKill - EatWhatYouKill@209da20d/SelectorProducer@e15b7e8/IDLE/p=false/QueuedThreadPool[qtp2030036700]@78ffe6dc{STARTED,8<=8<=200,i=6,q=0}[ReservedThreadExecutor@5fbdfdcf{s=0/4,p=0}][pc=0,pic=0,pec=0,epc=0]@2018-07-18T14:22:12.769+08:00 tryProduce false
14:22:12.769 [qtp2030036700-18] DEBUG org.eclipse.jetty.io.ManagedSelector - updateable 1
14:22:12.769 [qtp2030036700-18] DEBUG org.eclipse.jetty.io.ManagedSelector - update org.eclipse.jetty.io.ManagedSelector$$Lambda$22/1906879951@659499f1
14:22:12.769 [qtp2030036700-18] DEBUG org.eclipse.jetty.io.ManagedSelector - updates 0
14:22:12.769 [qtp2030036700-18] DEBUG org.eclipse.jetty.io.ManagedSelector - Selector sun.nio.ch.WindowsSelectorImpl@7371ec3a waiting with 0 keys
14:22:12.772 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{localhost:8091} added {acceptor-0@201a4587,POJO}
14:22:12.772 [main] DEBUG org.eclipse.jetty.util.thread.QueuedThreadPool - queue acceptor-0@201a4587
14:22:12.772 [main] INFO org.eclipse.jetty.server.AbstractConnector - Started ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{localhost:8091}
14:22:12.772 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2370ms ServerConnector@15aab8c6{HTTP/1.1,[http/1.1]}{localhost:8091}
14:22:12.772 [main] INFO org.eclipse.jetty.server.Server - Started @2371ms
14:22:12.772 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2371ms org.eclipse.jetty.server.Server@2beee7ff[9.4.11.v20180605]
14:22:12.777 [qtp2030036700-16] DEBUG org.eclipse.jetty.util.thread.QueuedThreadPool - run acceptor-0@201a4587
14:22:12.781 [main] WARN org.eclipse.jetty.server.handler.ContextHandler - Empty contextPath
14:22:12.784 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - o.e.j.s.h.ContextHandler@506ae4d4{/,null,UNAVAILABLE} added {org.apache.cxf.transport.http_jetty.JettyHTTPHandler@7d4f9aae,MANAGED}
14:22:12.785 [main] DEBUG org.eclipse.jetty.util.component.ContainerLifeCycle - org.eclipse.jetty.server.handler.ContextHandlerCollection@2b48a640[o.e.j.s.h.ContextHandler@506ae4d4{/,null,UNAVAILABLE}] added {o.e.j.s.h.ContextHandler@506ae4d4{/,null,UNAVAILABLE},UNMANAGED}
14:22:12.786 [main] DEBUG org.eclipse.jetty.server.handler.ContextHandlerCollection - ->[{o.e.j.s.h.ContextHandler@506ae4d4{/,null,UNAVAILABLE},[o.e.j.s.h.ContextHandler@506ae4d4{/,null,UNAVAILABLE}]}]
14:22:12.786 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting o.e.j.s.h.ContextHandler@506ae4d4{/,null,UNAVAILABLE}
14:22:12.791 [main] DEBUG org.eclipse.jetty.http.PreEncodedHttpField - HttpField encoders loaded: [org.eclipse.jetty.http.Http1FieldPreEncoder@534a5a98]
14:22:12.799 [main] DEBUG org.eclipse.jetty.server.handler.AbstractHandler - starting o.e.j.s.h.ContextHandler@506ae4d4{/,null,STARTING}
14:22:12.799 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - starting org.apache.cxf.transport.http_jetty.JettyHTTPHandler@7d4f9aae
14:22:12.799 [main] DEBUG org.eclipse.jetty.server.handler.AbstractHandler - starting org.apache.cxf.transport.http_jetty.JettyHTTPHandler@7d4f9aae
14:22:12.799 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2398ms org.apache.cxf.transport.http_jetty.JettyHTTPHandler@7d4f9aae
14:22:12.799 [main] INFO org.eclipse.jetty.server.handler.ContextHandler - Started o.e.j.s.h.ContextHandler@506ae4d4{/,null,AVAILABLE}
14:22:12.799 [main] DEBUG org.eclipse.jetty.util.component.AbstractLifeCycle - STARTED @2398ms o.e.j.s.h.ContextHandler@506ae4d4{/,null,AVAILABLE}
14:22:12.800 [main] DEBUG org.apache.cxf.endpoint.ServerImpl - register the server to serverRegistry 
14:22:12.804 [main] DEBUG org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder - building handler chain
14:22:12.805 [main] DEBUG org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder - Checking for HandlerChain annotation on java.lang.Class
14:22:12.805 [main] DEBUG org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder - Checking for HandlerChain annotation on java.io.Serializable
14:22:12.807 [main] DEBUG org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder - Checking for HandlerChain annotation on java.lang.reflect.GenericDeclaration
14:22:12.807 [main] DEBUG org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder - Checking for HandlerChain annotation on java.lang.reflect.Type
14:22:12.807 [main] DEBUG org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder - Checking for HandlerChain annotation on java.lang.reflect.AnnotatedElement
14:22:12.807 [main] DEBUG org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder - Checking for HandlerChain annotation on java.lang.Object
14:22:12.807 [main] DEBUG org.apache.cxf.jaxws.handler.AnnotationHandlerChainBuilder - no HandlerChain annotation on class java.lang.Class
publish success

3.3.2 cxf客户端问题

客户端代码

import com.study.test.simple.server.HellWorld;
import com.study.test.simple.server.HellWorldService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
/**
 * Created by Administrator on 2018/7/18.
 */
public class MainClient {
    public static void main(String[] arg){
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(HellWorld.class);
        factory.setAddress("http://localhost:8091/HelloWorld?wsdl");
        HellWorld helloworld = (HellWorld) factory.create();
        System.out.println(helloworld.sayHello("outofmemory.cn"));
    }
}

产生下面的问题

Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: object is not an instance of declaring class while invoking public abstract java.lang.String com.study.test.simple.server.HellWorld.sayHello(java.lang.String) with params [outofmemory.cn].
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:161)
    at com.sun.proxy.$Proxy42.sayHello(Unknown Source)
    at com.study.test.simple.client.MainClient.main(MainClient.java:16)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: org.apache.cxf.binding.soap.SoapFault: object is not an instance of declaring class while invoking public abstract java.lang.String com.study.test.simple.server.HellWorld.sayHello(java.lang.String) with params [outofmemory.cn].
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault(Soap11FaultInInterceptor.java:87)
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:53)
    at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:42)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
    at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:112)
    at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:70)
    at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:35)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
    at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:833)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1695)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1572)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1373)
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:673)
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:537)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:446)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:361)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:139)
    ... 7 more

object is not an instance of declaring class while invoking

本地安装soapUI 后,查看,依然报这个问题,查看server端,果然也报错,说明server端有问题

object is not an instance of declaring class while invoking public abstract java.lang.String com.study.test.simple.server.HellWorld.sayHello(java.lang.String) with params [hello].
 //第一种发布方式:通过CXF提供的JaxWsServerFactoryBean来发布webservice
        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
        factory.setServiceClass(HellWorld.class);
        factory.setAddress("http://localhost:8091/HelloWorld");
        factory.setServiceBean(HelloWorldImpl.class);
        Server server = factory.create();
        System.out.println("publish success");

上面是server端的代码,factory.setServiceBean 查找api

public void setServiceBean(Object serviceBean)
Sets the bean implementing the service. If this is set a BeanInvoker is created for the provided bean.
Parameters:
serviceBean - an instantiated implementation object

修改成

//第一种发布方式:通过CXF提供的JaxWsServerFactoryBean来发布webservice
        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
        factory.setServiceClass(HellWorld.class);
        factory.setAddress("http://localhost:8091/HelloWorld");
        factory.setServiceBean(new HelloWorldImpl());
        Server server = factory.create();
        System.out.println("publish success");

重新生成WSDL,然后客户端调用,成功!

3.3.3 No services have been found.

用springboot来做cxf的时候,启动工程,访问

http://localhost:8080/services/UserService?wsdl

的时候,页面反馈:No service was found.

以下是贴代码的时候,一个接口类,一个实现类,一个Configuration类,然后就是启动spring boot类

package com.complex;

import com.complex.bean.User;
import org.springframework.stereotype.Component;

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

/**
 * Created by Administrator on 2018/7/19.
 */
@WebService(name="UserService",targetNamespace="http://complex.com/")
@Component
public interface UserService {
    @WebMethod
    String getName(@WebParam(name = "userId") String userId);

    @WebMethod
    User getUser(String userId);
}

实现类


import com.complex.bean.User;
import org.springframework.stereotype.Component;

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

/**
 * Created by Administrator on 2018/7/19.
 */
@WebService(serviceName = "UserService",targetNamespace="http://complex.com/", endpointInterface = "com.complex.UserService")
@Component("aaa")
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("411001");
        user.setUsername("zhansan");
        user.setAge("20");
        user.setUpdateTime(new Date());
        userMap.put(user.getUserId(), user);

        user = new User();
        user.setUserId("411002");
        user.setUsername("lisi");
        user.setAge("30");
        user.setUpdateTime(new Date());
        userMap.put(user.getUserId(), user);

        user = new User();
        user.setUserId("411003");
        user.setUsername("wangwu");
        user.setAge("40");
        user.setUpdateTime(new Date());
        userMap.put(user.getUserId(), 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);
    }
}
package com.complex;

import javax.xml.ws.Endpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


/**
 * Created by Administrator on 2018/7/19.
 */
@Configuration
public class TestConfig {
     @Autowired
    private Bus bus;

    @Autowired
    public UserService aaa;

    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(bus, aaa);
        endpoint.publish("/UserService");//接口发布在 /NetbarServices 目录下
        return endpoint;
    }


}

http://localhost:8080/services/UserService?wsdl

的时候,页面反馈:No service was found.

发现configration类根本没有调用,为什么呢?

检查注解@Autowired @Configuration 都正确

SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描!“Application类”是指SpringBoot项目入口类。这个类的位置很关键:如果Application类所在的包为:com.boot.app,则只会扫描com.boot.app包及其所有子包,如果service或dao所在包不在com.boot.app及其子包下,则不会被扫描!即, 把Application类放到dao、service所在包的上级,com.boot.Application知道这一点非常关键

@SpringBootApplication
public class Application  extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);     
    }

main 所在的类必须放在所有bean的上面!

3.3.4 学习整理

cxf-spring-boot-starter-jaxws Java™ API for XMLWeb Services (JAX-WS)

cxf-spring-boot-starter-jaxrs JavaAPI for RESTful Web Services

4. restful web service

web service最近几年restful大行其道,大有取代传统soap web service的趋势,但是一些特有或相对老旧的系统依然使用了传统的soap web service,例如银行、航空公司的机票查询接口

RESTful Web Service是一种遵守REST式风格的Web服务。REST服务是一种ROA(Resource-Oriented Architecture,面向资源的架构)应用。其主要特点是方法信息存在于HTTP协议的方法中(比如GET、PUT),作用域存在于URI中。例如,在一个获取设备资源列表的GET请求中,方法信息是GET,作用域信息是URI中包含的对设备资源的过滤、分页和排序等条件。

JAX-RS是Java领域的REST式的Web服务的标准规范,是使用Java完成REST服务的基本约定。

JAX-WS。直到Java EE 6(发布于2008年9月)通过JCP(Java Community Process)组织定义的JSR311(http://www.jcp.org/en/jsr/detail?id=311),才将REST在Java领域标准化。

相关文章

    暂无相关文章
相关栏目:

用户点评