• Java dom4j解析RESTFull风格发布的WebService的xml文件


       公司项目要求解析出RESTFull风格发布的WebService接口的所有请求方法,参数,参数类型,已经方法是返回类型,想来想去都不知道该怎么办,思来想去然后又研究RESTFull风格WebService的xml文件,发现其实对于Java简单类型的 方法是能在xml文件中体现的,但是对于复杂类型,比如参数是一个对象,或者返回值是一个对象或者List,Map等。这些返回类型在xml文件中的 response下representation这个节点的属性type会是一个"application/json"。对于这些返回类型或者参数我没法 知道是什么类型,所以我就默认给这些Object类型。对于void类型的方法,会在response的status属性等于204,所以我就笨笨的用HttpClient抓去整个xml文件,然后用dome4j解析这个xml,幸好的是我在项目只需要解析简单类型的方法,所以想想也能达到要求.

      1 package xxx.xxx.common;
      2  
      3  import java.util.List;
      4  
      5  import org.apache.commons.httpclient.HttpClient;
      6  import org.apache.commons.httpclient.HttpStatus;
      7  import org.apache.commons.httpclient.methods.GetMethod;
      8  import org.dom4j.Document;
      9  import org.dom4j.DocumentException;
     10  import org.dom4j.DocumentHelper;
     11  import org.dom4j.Element;
     12  
     13  import com.google.common.collect.Lists;
     14  import com.qya.vo.transform.TransformParamVO;
     15  import com.qya.vo.transform.TransformVO;
     16  
     17  import com.qya.utils.string.StringUtil;
     18  
     19  public class TransformWsUrlUtil {
     20  
     21      protected final String DEFAULT_URL = "http://localhost:8080/bpms/services?_wadl";
     22  
     23      public static List<TransformVO> transform(String url) {
     24          String xml = getTransformXml(url);
     25          Document doc = null;
     26          try {
     27              doc = DocumentHelper.parseText(xml);
     28          } catch (DocumentException e) {
     29              e.printStackTrace();
     30          }
     31          List<TransformVO> lst = Lists.newArrayList();
     32          String rootPath = "";
     33          Element resourcesEl = doc.getRootElement().element("resources");
     34          if (resourcesEl.hasContent()) {
     35              List<Element> els = resourcesEl.elements();
     36              for (Element resEl : els) {
     37                  rootPath = resEl.attribute(0).getText();
     38                  if (resEl.hasContent()) {
     39                      lst.addAll(getMethod(rootPath, resEl.elements()));
     40                  }
     41              }
     42          }
     43          return lst;
     44      }
     45  
     46      // 所有方法列表
     47      public static List<TransformVO> getMethod(String rootPath, List<Element> els) {
     48          List<TransformVO> lst = Lists.newArrayList();
     49          String wsPath = "";
     50          String returnType = "";
     51          for (Element el : els) {
     52              returnType = transform2JavaType(getReturnType(el));
     53              wsPath = el.attribute("path").getText();
     54              if(!"java.lang.Object".equals(returnType)){  //此处我做了判断,只需要简单类型和void类型的方法
     55                  TransformVO vo = new TransformVO();
     56                  vo.setUrl(transform2JavaType(rootPath + wsPath));
     57                  vo.setUrlMethodName(transform2JavaType(returnType + "   " + replaceSeparatorLine(wsPath) + getParamters(el)));
     58                  vo.setMethodName(transform2JavaType(wsPath));
     59                  vo.setReturnType(returnType);
     60                  List<TransformParamVO> paramLst = getParamterVO(el);
     61                  vo.setTransformParamLst(paramLst);
     62                  lst.add(vo);
     63              }
     64          }
     65          return lst;
     66      }
     67  
     68      /**
     69       * 获取方法的所有参数
     70       * 
     71       * @param el
     72       * @return 参数字符串
     73       */
     74      public static String getParamters(Element el) {
     75          StringBuffer buf = new StringBuffer("(");
     76          Element requestEl = el.element("method").element("request");
     77          if (!StringUtil.isNullOrEmpty(requestEl)) {
     78              if (requestEl.hasContent()) {
     79                  for (Element paramEl : (List<Element>) requestEl.elements()) {
     80                      if ("param".equals(paramEl.getName())) {
     81                          buf.append(paramEl.attributeValue("type") + "  " + paramEl.attributeValue("name") + ",   ");
     82                      }
     83                      if ("representation".equals(paramEl.getName())) {
     84                          if (paramEl.hasContent()) {
     85                              for (Element pEl : (List<Element>) paramEl.elements()) {
     86                                  buf.append(pEl.attributeValue("type") + "  " + pEl.attributeValue("name") + ",   ");
     87                              }
     88                          }
     89                      }
     90                  }
     91              }
     92          }
     93          buf.append(")");
     94          return buf.toString();
     95      }
     96  
     97      public static List<TransformParamVO> getParamterVO(Element el) {
     98          List<TransformParamVO> lst = Lists.newArrayList();
     99          Element requestEl = el.element("method").element("request");
    100          if (!StringUtil.isNullOrEmpty(requestEl)) {
    101              if (requestEl.hasContent()) {
    102                  for (Element paramEl : (List<Element>) requestEl.elements()) {
    103                      if ("param".equals(paramEl.getName())) {
    104                          TransformParamVO vo = new TransformParamVO();
    105                          vo.setName(paramEl.attributeValue("name"));
    106                          vo.setType(transform2JavaType(paramEl.attributeValue("type")));
    107                          lst.add(vo);
    108                      }
    109                      if ("representation".equals(paramEl.getName())) {
    110                          if (paramEl.hasContent()) {
    111                              for (Element pEl : (List<Element>) paramEl.elements()) {
    112                                  TransformParamVO vo = new TransformParamVO();
    113                                  vo.setName(pEl.attributeValue("name"));
    114                                  vo.setType(transform2JavaType(pEl.attributeValue("type")));
    115                                  lst.add(vo);
    116                              }
    117                          }
    118                      }
    119                  }
    120              }
    121          }
    122          return lst;
    123      }
    124  
    125      /*
    126       * 获取返回类型
    127       */
    128      public static String getReturnType(Element el) {
    129          String returnType = "";
    130          List<Element> returnTypeEls = el.element("method").element("response").elements("representation");
    131          if (!StringUtil.isNullOrEmpty(returnTypeEls)) {
    132              if (returnTypeEls.isEmpty()) {
    133                  if (!StringUtil.isNullOrEmpty(el.element("method").element("response").attribute("status"))) {
    134                      if ("204".equals(el.element("method").element("response").attribute("status").getText())) {
    135                          returnType = "void";
    136                      }
    137                  }
    138              } else {
    139                  for (Element returnTypeEl : returnTypeEls) {
    140                      if (returnTypeEl.hasContent()) {
    141                          for (Element pEl : (List<Element>) returnTypeEl.elements()) {
    142                              returnType = pEl.attributeValue("type");
    143                          }
    144                      } else {
    145                          returnType = "java.lang.Object";
    146                      }
    147                  }
    148              }
    149          }
    150          return returnType;
    151      }
    152  
    153      private static String transform2JavaType(String str) {
    154          if (!StringUtil.isNullOrEmpty(str)) {
    155              if (str.contains("xs:int")) {
    156                  str = str.replaceAll("xs:int", "java.lang.Integer");
    157              }
    158              if (str.contains("xs:string")) {
    159                  str = str.replaceAll("xs:string", "java.lang.String");
    160              }
    161              if (str.contains("xs:boolean")) {
    162                  str = str.replaceAll("xs:boolean", "java.lang.Boolean");
    163              }
    164              if (str.contains("xs:double")) {
    165                  str = str.replaceAll("xs:double", "java.lang.Double");
    166              }
    167              if (str.contains("xs:dateTime")) {
    168                  str = str.replaceAll("xs:dateTime", "java.util.Date");
    169              }
    170              if (str.lastIndexOf(",") > 0) {
    171                  str = str.substring(0, str.lastIndexOf(",")) + ")";
    172              }
    173          }
    174          return str;
    175      }
    176      private static String replaceSeparatorLine(String str) {
    177          if (!StringUtil.isNullOrEmpty(str)) {
    178              if (str.contains("/")) {
    179                  str = str.replaceAll("\\/", "");
    180              }
    181          }
    182          return str;
    183      }
    184  
    185      /**
    186       * 后去需要转换的xml内容
    187       * 
    188       * @param url
    189       *            访问的webservice url
    190       * @return xml内容
    191       */
    192      private static String getTransformXml(String url) {
    193          String xml = "";
    194          HttpClient httpClient = new HttpClient();
    195          GetMethod getMethod = new GetMethod(url);
    196          try {
    197              int statusCode = httpClient.executeMethod(getMethod);
    198              if (statusCode != HttpStatus.SC_OK) {
    199                  System.err.println("Method failed: " + getMethod.getStatusLine());
    200              }
    201              // 读取内容
    202              byte[] responseBody = getMethod.getResponseBody();
    203              // 处理内容
    204              xml = new String(responseBody);
    205          } catch (Exception e) {
    206              System.err.println("页面无法访问");
    207          } finally {
    208              getMethod.releaseConnection();
    209          }
    210          return xml;
    211      }
    212  
    213  }

    TransformVO.java

     1 package com.qya.vo.transform;
     2  
     3  import java.io.Serializable;
     4  import java.util.List;
     5  
     6  import com.google.common.collect.Lists;
     7  
     8  public class TransformVO implements Serializable {
     9      
    10      private static final long serialVersionUID = -8192032660217273046L;
    11      private String url;
    12      private String urlMethodName;
    13      private String methodName;
    14      private String returnType;
    15      private List<TransformParamVO> transformParamLst = Lists.newArrayList();
    16      public String getUrl() {
    17          return url;
    18      }
    19      public void setUrl(String url) {
    20          this.url = url;
    21      }
    22      public String getUrlMethodName() {
    23          return urlMethodName;
    24      }
    25      public void setUrlMethodName(String urlMethodName) {
    26          this.urlMethodName = urlMethodName;
    27      }
    28      public String getMethodName() {
    29          return methodName;
    30      }
    31      public void setMethodName(String methodName) {
    32          this.methodName = methodName;
    33      }
    34      public String getReturnType() {
    35          return returnType;
    36      }
    37      public void setReturnType(String returnType) {
    38          this.returnType = returnType;
    39      }
    40      public List<TransformParamVO> getTransformParamLst() {
    41          return transformParamLst;
    42      }
    43      public void setTransformParamLst(List<TransformParamVO> transformParamLst) {
    44          this.transformParamLst = transformParamLst;
    45      }
    46  }

     TransformParamVO.java

     1 package com.qya.vo.transform;
     2  
     3  import java.io.Serializable;
     4  
     5  public class TransformParamVO implements Serializable {
     6  
     7      private static final long serialVersionUID = 2728404017781534263L;
     8      private String type;
     9      private String name;
    10      public String getType() {
    11          return type;
    12      }
    13      public void setType(String type) {
    14          this.type = type;
    15      }
    16      public String getName() {
    17          return name;
    18      }
    19      public void setName(String name) {
    20          this.name = name;
    21      }
    22      
    23  }
    StringUtil.java
     1 package com.qya.utils.string.StringUtil
     2 
     3 public class StringUtil {
     4 
     5     /**
     6      * 判断是否为空后null
     7      * 
     8      * @param obj
     9      *            对象
    10      * @return boolean
    11      * @since 1.0
    12      */
    13     public static boolean isNullOrEmpty(Object obj) {
    14         return obj == null || "".equals(obj.toString());
    15     }
    16 }
     
  • 相关阅读:
    NDOC中文支持及入门用法
    网页代码常用小技巧
    SOCKET通讯点滴
    自动备份程序目录
    MySql.Data.dll Microsoft.Web.UI.WebControls.dll下载
    c#:获取IE地址栏中的URL
    比较好的单例登录模式(参考网友)
    FreeTextBox使用详解
    2005自定义控件显示基准线
    连接字符串大全
  • 原文地址:https://www.cnblogs.com/quanyongan/p/3027291.html
Copyright © 2020-2023  润新知