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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Spring Boot中实现Web服务接口可以通过以下步骤进行: 1. 添加依赖:在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> ``` 2. 创建接口创建一个接口来定义Web服务的操作。例如,创建一个名为`HelloWorldService`的接口,并在其中定义一个`sayHello`方法: ```java @WebService public interface HelloWorldService { @WebMethod String sayHello(String name); } ``` 3. 实现接口创建一个实现接口的类,并在其中实现接口中定义的方法。例如,创建一个名为`HelloWorldServiceImpl`的类: ```java @Service @WebService(endpointInterface = "com.example.HelloWorldService") public class HelloWorldServiceImpl implements HelloWorldService { @Override public String sayHello(String name) { return "Hello, " + name + "!"; } } ``` 4. 配置WebService:在`application.properties`文件中添加以下配置: ```properties # 指定WebService的路径 spring.webservices.path=/webService/ws ``` 5. 启动应用程序:创建一个Spring Boot应用程序,并在`main`方法中启动它: ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 现在,您已经成功地在Spring Boot中实现了一个简单的Web服务接口。您可以使用Java客户端或通过访问`http://localhost:8080/webService/ws/api?wsdl`来测试该接口

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小辰~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值