【WSDL】01 JAX-WS 入门案例

 

去年这个时候工作遇见时暂时总结的笔记:

https://www.cnblogs.com/mindzone/p/14777493.html

当时也不是很清楚,直到最近前同事又遇上了这项技术,

除了WSDL,还多另一个CXF框架,那看来还是需要再学习一下的

 

B站搜了一下,还找到了,黑马19期Java班还讲了

黑马视频参考地址:

https://www.bilibili.com/video/BV1zf4y1H7UG

 

JAX-WS 入门案例:

用IDEA创建普通Java工程,不需要Maven和任何依赖

这一套工具库是JDK官方提供的内容

 

一、编写服务端

1、首先需要提供一个接口,说明服务端需要怎样对外提供数据服务

package cn.cloud9.jax_ws.server.intf;

/**
 * 天气接口
 */
public interface WeatherInterface {
    /**
     * 根据城市名称参数,返回该城市的天气
     * @param cityName
     * @return
     */
    String queryWeather(String cityName);
}

  

2、然后实现这个接口,并且标记为这是一个WebService接口

package cn.cloud9.jax_ws.server.intf;

import javax.jws.WebService;

/**
 * @author OnCloud9
 * @description
 * @project WebService
 * @date 2022年04月23日 11:10
 *
 * 标注此接口是Web服务接口
 */
@WebService
public class WeatherInterfaceImpl implements WeatherInterface{
    @Override
    public String queryWeather(String cityName) {
        System.out.println("打印城市名称:" + cityName);
        return cityName + " 天气:晴朗";
    }
}

 

3、创建启动类,提供地址和服务接口,发布服务

地址是服务所在的主机地址,端口可以任意设置(没有占用的)

package cn.cloud9.jax_ws.server;

import cn.cloud9.jax_ws.server.intf.WeatherInterfaceImpl;

import javax.xml.ws.Endpoint;

/**
 * @author OnCloud9
 * @description
 * @project WebService
 * @date 2022年04月23日 11:12
 */
public class ServerMain {

    public static void main(String[] args) {
        /**
         * 发布服务
         * 服务访问地址:
         * http://127.0.0.1:9090/weather?wsdl
         * WSDL阅读方式,从下向上
         */
        String url = "http://127.0.0.1:9090/weather";
        Endpoint.publish(url, new WeatherInterfaceImpl());
    }
}

  

启动之后,可以使用浏览器访问服务发布定义的地址

需要添加GET参数?wsdl

http://127.0.0.1:9090/weather?wsdl

 

二、编写客户端

服务端案例开发完成,接着是客户端案例的开发

这个发布的服务,其实相当于一个调用说明书:

http://127.0.0.1:9090/weather?wsdl

使用XML记载了资源名称等等

JDK提供了一个 生成工具,wimport.exe工具

可以直接根据服务说明书,生成客户端需要的接口资源

 

命令:

wimport -s . http://127.0.0.1:9090/weather?wsdl

 

可以发现是完全按照服务端编写包位置生成的,
这里把Server包重命名成Client包

然后编写客户端启动类

package cn.cloud9.jax_ws.client;

import cn.cloud9.jax_ws.client.intf.WeatherInterfaceImpl;
import cn.cloud9.jax_ws.client.intf.WeatherInterfaceImplService;

import java.io.UnsupportedEncodingException;


/**
 * @author OnCloud9
 * @description
 * @project JAX-WS-Client
 * @date 2022年04月23日 11:31
 */
public class WeatherClient {

    public static void main(String[] args) throws UnsupportedEncodingException {
        // 创建服务视图
        final WeatherInterfaceImplService implService =
                new WeatherInterfaceImplService();

        // 获取服务实现类
        final WeatherInterfaceImpl instance =
                implService.getPort(WeatherInterfaceImpl.class);

        String city = "南昌";

        // 调用查询方法
        final String queryWeather = instance.queryWeather(new String(city.getBytes("GBK")));
        System.out.println(queryWeather);
    }
}  

 

启动之后发现报错了

两个类具有相同的 XML 类型名称 "{http://intf.server.jax_ws.cloud9.cn/}queryWeatherResponse"。
请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。

Exception in thread "main" com.sun.xml.internal.ws.spi.db.DatabindingException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
两个类具有相同的 XML 类型名称 "{http://intf.server.jax_ws.cloud9.cn/}queryWeatherResponse"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。
    this problem is related to the following location:
        at cn.cloud9.jax_ws.client.intf.QueryWeatherResponse
        at public javax.xml.bind.JAXBElement cn.cloud9.jax_ws.client.intf.ObjectFactory.createQueryWeatherResponse(cn.cloud9.jax_ws.client.intf.QueryWeatherResponse)
        at cn.cloud9.jax_ws.client.intf.ObjectFactory
    this problem is related to the following location:
        at cn.cloud9.jax_ws.server.intf.QueryWeatherResponse

然后根据报错信息我找到了对应的资源

发现wimport生成的注解是这样的

只提供了一个name值,但是报错还要求一个namespace,

这里只要根据错误提示,名字和命名空间不一样就可以了

 

修改之后,启动客户端,调用成功

 

 

  

 

posted @ 2022-04-23 12:22  emdzz  阅读(131)  评论(0编辑  收藏  举报