WebService接口的创建与实现
WebService接口的创建与实现三种实现方式+示例
WebService接口的创建与实现
目录结构
1.1 pom文件依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.8</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.18.Final</version>
</dependency>
1.2 创建接口
HelloWebService.java
package com.xc.demo_01.webservice;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService(name = "HelloWebService", //portType名称 客户端生成代码时 为接口名称,暴露服务名
targetNamespace = "http://webservice.demo_01.xc.com" //wsdl命名空间,一般为接口的包名倒序
)
public interface HelloWebService {
/*
* @WebResult : 表示方法的返回值
* @WebParam : 表示方法的参数
*/
@WebMethod
@WebResult(name = "String")
String sendMessage(@WebParam(name="name") String name);
}
HelloWebServiceImpl.java
package com.xc.demo_01.webservice.impl;
import javax.jws.WebParam;
import javax.jws.WebService;
import com.xc.demo_01.webservice.HelloWebService;
import org.springframework.context.annotation.Configuration;
@WebService(
targetNamespace = "http://webservice.demo_01.xc.com", //与接口中命名空间一致
serviceName = "HelloWebService", //与接口中指定的name一致
endpointInterface = "com.xc.demo_01.webservice.HelloWebService")//指定发布webservice的接口类,此类也需要接入@WebService注解
@Configuration
public class HelloWebServiceImpl implements HelloWebService {
@Override
public String sendMessage(@WebParam(name="name") String name) {
System.out.println("欢迎你 " + name);
return "Hello, " + name;
}
}
CxfWebServiceConfig.java
package com.xc.demo_01.config;
import javax.xml.ws.Endpoint;
import com.xc.demo_01.webservice.HelloWebService;
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;
/**
* cxf配置类
*/
@Configuration
public class CxfWebServiceConfig {
@Autowired
private Bus bus;
@Autowired
private HelloWebService helloWebService;
// @Bean(name = Bus.DEFAULT_BUS_ID)
// public SpringBus springBus(){
// return new SpringBus();
// }
@Bean
public Endpoint endpoint(){
// Endpoint endpoint = new EndpointImpl(new SpringBus(),helloWebService);
Endpoint endpoint = new EndpointImpl(bus,helloWebService);
// http://localhost:9527/services/helloWebService?wsdl
endpoint.publish("/HelloWebService");
return endpoint;
}
}
1.3 客户端实现接口(方法一)
WebServiceHelloW.java
package com.xc.demo_01.client;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
/**
* JaxWsDynamicClientFactory:
* 只要指定服务器端wsdl文件的位置,然后指定要调用的方法和方法的参数即可,不关心服务端的实现方式。
* @author wyp
*/
public class WebServiceHelloW {
public static void main(String[] args) {
//创建动态客户端
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:9527/services/HelloWebService?wsdl");
Object[] objects = new Object[0];
try {
objects = client.invoke("sendMessage","wyp");
System.out.println("返回数据:" + objects[0]);
} catch (Exception e) {
e.printStackTrace();
}
}
}
1.4 客户端实现接口(方法二)
WebServiceHelloP.java
package com.xc.demo_01.client;
import com.xc.demo_01.webservice.HelloWebService;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
/**
* JaxWsProxyFactoryBean:
* 缺点:要求服务器端的webservice必须是java实现--这样也就失去了使用webservice的意义
* @author wyp
*/
public class WebServiceHelloP {
public static void main(String[] args) {
//创建cxf代理工厂
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
//设置远程访问服务端地址
factory.setAddress("http://localhost:9527/services/HelloWebService");
//设置接口类型
factory.setServiceClass(HelloWebService.class);
//对接口生成代理对象(两种方式)
//Object o = factory.create();
//HelloWebService helloWebService = (HelloWebService) o;
HelloWebService helloWebService = factory.create(HelloWebService.class);
//远程访问服务端方法
helloWebService.sendMessage("Jack");
}
}
1.4 客户端实现接口(方法三)
通过wsimport
命令下载。
打开命令窗口进入要下载文件的目录,执行以下命令:
wsimport -s . http://localhost:9527/services/HelloWebService?wsdl
或者将http://localhost:9527/services/HelloWebService?wsdl的xml内容保存到本地HelloWebService.xml,执行以下命令:
wsimport -s . HelloWebService.xml
之后会生成一堆文件。
将java文件复制到项目中。
注意: 如果是以xml文件执行的命令,下载完代码后这里要改为http://localhost:9527/services/HelloWebService?wsdl
地址
编写App.java
package com.xc.client;
import com.xc.demo_01.webservice.HelloWebService;
import com.xc.demo_01.webservice.HelloWebService_Service;
/**
* @author wyp
*/
public class App {
public static void main(String[] args) {
//创建带有@WebServiceClient注解的类的实例
HelloWebService_Service service = new HelloWebService_Service();
//创建客户端代理对象
HelloWebService proxy = service.getHelloWebServiceImplPort();
//调用方法
String rose = proxy.sendMessage("Rose");
System.out.println("返回数据:" + rose);
}
}
1.5 webxml网站接口实现示例
在http://www.webxml.com.cn/zh_cn/index.aspx网站找接口实现:
这里以http://ws.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl
测试QQ是否在线为例。
先去cmd命令中进入你想保存的指定目录下,执行wsimport -s . http://ws.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl
,之后会生成很多java文件,将java文件复制到项目中。
TestQQApp.java
package com.xc.demo_04.qqclient;
/**
* 腾讯QQ在线状态 WEB 服务
* WSDL: http://ws.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl
*
* 控制台:选择合适文件夹运行 "wsimport -s . WSDL地址"生成java代码
*
* qqCheckOnline
*
* 获得腾讯QQ在线状态
* 输入参数:QQ号码 String,默认QQ号码:8698053。
* 返回数据:String,Y = 在线;N = 离线;E = QQ号码错误;A = 商业用户验证失败;V = 免费用户超过数量
*/
public class TestQQApp {
public static void main(String[] args) {
//QqOnlineWebService类继承了Service类
QqOnlineWebService qqOnlineWebService = new QqOnlineWebService();
//创建客户端代理对象 QqOnlineWebServiceSoap是个接口
QqOnlineWebServiceSoap proxy = qqOnlineWebService.getQqOnlineWebServiceSoap();
//qqCheckOnline为服务方法名
String s = proxy.qqCheckOnline("456456456");
String result = "";
switch (s){
case "Y" : result="在线";break;
case "N" : result="离线";break;
case "E" : result="QQ号码错误";break;
case "A" : result="商业用户验证失败";break;
case "V" : result="免费用户超过数量";break;
}
System.out.println("QQ号状态:" + result);
}
}
执行命令时可能遇到的错误
-
[WARNING] src-resolve.4.2: 解析组件 ‘s:schema’ 时出错。在该组件中检测到 ‘s:schema’ 位于名称空间…
找到你保存下来的xxx.xml文件修改三个地方就OK找到文件中的这个
<s:element ref="s:schema"/><s:any/>
替换成<s:any minOccurs="2" maxOccurs="2"/>
就ok了 -
[ERROR]Can’t connect to SOCKS proxy:http
需关掉代理服务器。
更多推荐
所有评论(0)