有一个需求:要求根据设备mac和终端设备类型来查询设备库存状态。

接口协议是采用webservice协议,信息交互方式为xml格式信息

输入参数存放到XML各个节点下,并转为一个String,作为接口的输入参数。XML的封装格式如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<MSG_CONTENT>
< DEVICE_MAC></ DEVICE_MAC>
< DEVICE_TYPE></ DEVICE_TYPE>
</MSG_CONTENT>
</ROOT>

输出参数存放到XML各个节点下,并转为一个String,作为接口的输出参数。XML的封装格式如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
< RESULT_CODE >返回编码</ RESULT_CODE >
< RESULT_MSG >失败描述</ RESULT_MSG >
<STATE>终端状态</STATE>
<IS_EXIST>终端是否存在</IS_EXIST>
<OWNER_CITY>终端归属地市</OWNER_CITY>
</ROOT>

webservice也就是web服务,是一种跨平台跨语言的服务,类似就是一个第三方的服务,你写好接口让别人来调用,你是提供服务的一方。接口都是用来提供服务的,接口就是一组功能的集合。

在java中写webservice接口,需要在接口类上标注@WebService注解,表明这是一个webservice,@WebParam(name = "DEVICE_MAC")这个注解标注在方法参数上,表示获取的参数,注释用于定制从单个参数至 Web Service 消息部件和 XML 元素的映射。

例如:

@WebService
public interface qryIptvStateService {
//根据设备mac和设备类型查询库存状态信息
String qryIptvState(@WebParam(name = "DEVICE_MAC") String DEVICE_MAC);
}

现在实现这个接口

endpointInterface: 服务接口全路径, 指定做SEI(Service EndPoint Interface)服务端点接口

serviceName:表示对外发布的服务名(也就是接口文档中的方法名),指定 Web Service 的服务名称:wsdl:service。缺省值为 Java 类的简单名称 + Service。

@WebService(endpointInterface = "intf.zznode.device.qryIptvStateService", serviceName = "qryIptvState")
public class qryIptvStateServiceImpl extends BaseService implements qryIptvStateService {
@Override
public String qryIptvState(String xml) {
//业务代码
}
}

现在开始使用java构建xml文档节点

例如要构建这样结构的xml文档

<ROOT>
<MSG_CONTENT>
< DEVICE_MAC></ DEVICE_MAC>
< DEVICE_TYPE></ DEVICE_TYPE>
</MSG_CONTENT>
</ROOT>

主要的作用就是便于java对象与xml文件节点元素之间的转换

@XmlRootElement(name = "ROOT")将这个注解标注在java类上,表示这个是xml文档的根元素,名字为ROOT。

@XmlRootElement(name = "ROOT")
public class ROOTStoreInfo {
//root下面的msg_content元素
private StoreMsgContent MSG_CONTENT;
//setter/getter方法
}
public class StoreMsgContent {
private String DEVICE_MAC;
private String DEVICE_TYPE;
//setter/getter方法
}
最终构建出来的xml文档为
<ROOT>
<MSG_CONTENT>
< DEVICE_MAC></ DEVICE_MAC>
< DEVICE_TYPE></ DEVICE_TYPE>
</MSG_CONTENT>
</ROOT>
//最后需要将传入的xml格式的字符串映射解析为java类
public static <T> T xml2Object(String xmlStr, Class<T> c) {
try {
// JAXB(即Java Architecturefor XML Binding)是一个业界的标准,
//即是一项可以根据XML Schema产生Java类的技术。
//该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,
//并能将Java对象树的内容重新写到XML实例文档。
JAXBContext context = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = context.createUnmarshaller(); T t = (T) unmarshaller.unmarshal(new StringReader(xmlStr));
return t; } catch (JAXBException e) {
e.printStackTrace();
return null;
}
}

现在能够实现用java类构建xml格式的文档节点信息,并且能将传入的字符形式的xml格式数据映射为标注了@XmlRootElement的类。

现在需要将操作结果返回。

//用于响应返回的xml文档信息
//@XmlType 注解 propOrder的值是一个字符串数组,用来设置xml文档节点的顺序
@XmlRootElement(name = "ROOT")
@XmlType(propOrder = {"RESULT_CODE", "RESULT_MSG", "STATE", "IS_EXIST", "OWNER_CITY","OTT_STB_ID"})
public class ROOTStoreInfoRespone {
private String RESULT_CODE;//返回编码:1成功,0失败
private String RESULT_MSG;//失败描述,RESULT_CODE为0必填
private String STATE;//终端设备状态,RESULT_CODE为1必填
private String IS_EXIST;//终端设备是否存在:1存在,0不存在
private String OWNER_CITY;//终端归属地市,IS_EXIST为1时必填
private String OTT_STB_ID;//OTT序列号sn
//setter/getter方法
}
//用于将java类转换为xml格式
public static String getXml(ROOTStoreInfoRespone root) {
StringWriter wr = new StringWriter();
try {
//JAXBContext将java类与xml文档相互转换
JAXBContext context = JAXBContext.newInstance(ROOTStoreInfoRespone.class);
//使用Marshaller生成xml文件
Marshaller mar = context.createMarshaller();
//格式化xml格式
mar.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//去掉生成xml的默认报文头
// mar.setProperty(Marshaller.JAXB_FRAGMENT, true); mar.marshal(root, wr);
return wr.toString().replace("standalone=\"yes\"", "");
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} //调用
getXml(rootStoreInfoRespone)

总结:

java写webservice部分

@WebService该注解用于对接口,类进行注解,表示要发布的web服务。

它的属性(不全):

  • serviceName:表示发布的服务名称(通常为接口中的方法名称)
  • endpointInterface:表示发布服务的接口,采用类路径表示。

@WebParam(name = "DEVICE_MAC")表示方法的参数,注解用于标注参数,这个参数和传入的xml节点元素名相同,值为这个节点的值。

@WebResult表示方法的返回值

加上这两个注解 方法参数以及方法返回值将跟注解保持一致

如果不加,则wdsl中的参数是org01递增的,返回为return

java构建和解析xml部分

@XmlRootElement(name = "ROOT")将这个注解标注在java类上,表示这个是xml文档的根元素,名字为ROOT。这个类里面的属性即为xml中的节点元素。

@XmlType(propOrder = {"RESULT_CODE", "RESULT_MSG", "STATE", "IS_EXIST", "OWNER_CITY","OTT_STB_ID"})表示是xml类型。

propOrder 是一个字符数组,表示的是xml中节点元素的先后顺序。

xml格式的字符串映射为java类

将java类解析为xml文档格式。

主要是这次开发任务做了一个这样的需求,特此记录一下,对于webservice还不是很熟悉,还需要加强学习。

java写webservice接口的更多相关文章

  1. java 写webservice接口解析xml报文

    1 <!--解析xml报文--> 2 <dependency> 3 <groupId>dom4j</groupId> 4 <artifactId& ...

  2. Java调用webservice接口方法

                             java调用webservice接口   webservice的 发布一般都是使用WSDL(web service descriptive langu ...

  3. Java调用webservice接口方法(SOAP message、xfire、axis)

    webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...

  4. 用Python写WebService接口并且调用

    一.用ladon框架封装Python为Webservice接口 另用soaplib实现请看:    http://www.jianshu.com/p/ad3c27d2a946 功能实现的同时,希望将接 ...

  5. java 调用webservice接口wsdl,推荐使用wsdl2java,放弃wsimport

    网上说wsimport是jdk1.6后自带的客户端生成调用webservice接口的工具,其实我挺喜欢原生的东西,毕竟自家的东西用着应该最顺手啊,但往往让人惊艳的是那些集成工具. 本机jdk1.8.1 ...

  6. java 调用webservice接口

    webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...

  7. Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用

    近来由于项目需要,需要用到手机短信验证码的功能,其中最主要的是用到了第三方提供的短信平台接口WebService客户端接口,下面我把我在项目中用到的记录一下,以便给大家提供个思路,由于本人的文采有限, ...

  8. java调用webservice接口 几种方法

    webservice的 发布一般都是使用WSDL(web service descriptive language)文件的样式来发布的,在WSDL文件里面,包含这个webservice暴露在外面可供使 ...

  9. 几种Java写webservice的比较

    Java6,Axis2.XFire.CXF 1.JWS是Java语言对WebService服务的一种实现,用来开发和发布服务.而从服务本身的角度来看JWS服务是没有语言界限的.但是Java语言为Jav ...

随机推荐

  1. Go语言学习之介绍与环境搭建

    Go语言第一课 一.Go语言介绍 1.什么是Go语言? Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pik ...

  2. 前端三大框架(Angular Vue React)

    前端,HTML(超文本标记语言),CSS(层叠样式表)和JavaScript(脚本语言) HTML,通常说的h5,其实按标准来说,HTML4的后续版本不带编号了,并保证向前的兼容性 CSS的版本3,增 ...

  3. hive简单学习---1

    ---------------------------------------------------------------------------------------------------- ...

  4. Java数组(3):创建测试数据

    有时我们需要使用数组批量创建测试数据,接下来通过以下4点来举例. (1) 使用Arrays.fill()填充数据 (2) 使用Random类中JDK1.8提供的新方法用来生成随机数 (3) 一个随机数 ...

  5. PHP学习(8)——面向对象(下)

    8.编写代码类 每个分离的函数可以执行一个明确的任务.任务越简单,编写与测试这个函数就越简单,当然也不要将这个函数分得太小——若将程序分成太多的小个体,读起来就会很困难. 使用继承可以重载操作.我们可 ...

  6. vue工程中,如何查询用户访问的地理位置 + vue中的jsonp

    有一个需求,就是当用户访问你们公司的网站时,需要查到这位用户的地理位置(通过电脑ip来访问) 试了很多方法,感觉使用腾讯的位置服务api最好,返回的信息最全,包括经纬度,国家城市地区等.而其他绝大多数 ...

  7. D3 GEO应用专题(一):绘制旋转的3D地球

    https://gallery.echartsjs.com/explore.html#sort=rank~timeframe=all~author=all 雷达图 https://blog.csdn. ...

  8. linux-关闭文件

    1.打开参考: http://q.cnblogs.com/q/39275/ http://hi.baidu.com/auxor/item/49b6e929fdf16dc7ed10f197 2.关闭参考 ...

  9. 浅谈 OpenResty,基于opebresty+redis进行实时线上限流

    一.前言 我们都知道Nginx有很多的特性和好处,但是在Nginx上开发成了一个难题,Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用C开发模块必须要熟悉Nginx的源代码,使得开 ...

  10. 第六周&java实验报告四

    实验报告: 一.实验目的 (1)掌握类的继承 (2)变量的继承和覆盖,方法的继承,重载和覆盖的实现: 二.实验的内容 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:rad ...