有⼀个需求:要求根据设备mac和终端设备类型来查询设备库存状态。接⼝协议是采⽤webservice协议,信息交互⽅式为xml格式信息
输⼊参数存放到XML各个节点下,并转为⼀个String,作为接⼝的输⼊参数。XML的封装格式如下所⽰:
< DEVICE_MAC> DEVICE_MAC> < DEVICE_TYPE> DEVICE_TYPE>
输出参数存放到XML各个节点下,并转为⼀个String,作为接⼝的输出参数。XML的封装格式如下所⽰:
< RESULT_CODE >返回编码 RESULT_CODE > < RESULT_MSG >失败描述 RESULT_MSG >
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\public class qryIptvStateServiceImpl extends BaseService implements qryIptvStateService { @Override
public String qryIptvState(String xml) { //业务代码 }}
现在开始使⽤java构建xml⽂档节点例如要构建这样结构的xml⽂档
< DEVICE_MAC> DEVICE_MAC> < DEVICE_TYPE> DEVICE_TYPE>
主要的作⽤就是便于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⽂档为 < DEVICE_MAC> DEVICE_MAC> < DEVICE_TYPE> DEVICE_TYPE>
//最后需要将传⼊的xml格式的字符串映射解析为java类
public static // 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\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\表⽰是xml类型。propOrder 是⼀个字符数组,表⽰的是xml中节点元素的先后顺序。xml格式的字符串映射为java类将java类解析为xml⽂档格式。 主要是这次开发任务做了⼀个这样的需求,特此记录⼀下,对于webservice还不是很熟悉,还需要加强学习。 因篇幅问题不能全部显示,请点此查看更多更全内容