zoukankan      html  css  js  c++  java
  • java写webservice接口

    有一个需求:要求根据设备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还不是很熟悉,还需要加强学习。

  • 相关阅读:
    openVolumeMesh example 程序学习
    使用字符串创建java 对象
    HDU-1501-Zipper
    UVA-10285-Longest Run on a Snowboard
    HDU-2182-Frog
    HDU-2044-一只小蜜蜂
    POJ-1163-The Triangle
    HDU-1159-Common Subsequence
    HDU-2069-Coin Change
    HDU-4864-Task
  • 原文地址:https://www.cnblogs.com/jasonboren/p/11870054.html
Copyright © 2011-2022 走看看