【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,
这里只要根据错误提示,名字和命名空间不一样就可以了
修改之后,启动客户端,调用成功