用axis方式调用WebService,返回类型为字符串数组(包括把数据库数据导出存为xml,xml转化成字符串)

来源:互联网 发布:极客学院java 编辑:程序博客网 时间:2024/05/14 00:20
import java.io.File;import java.rmi.RemoteException;import javax.xml.namespace.QName;import javax.xml.rpc.ServiceException;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.io.SAXReader;public class WeatherWebService {//这个方法返回所有工单记录public static String[] selectAllCargoInfor() {// webservice路径// 这里后面加不加 "?wsdl" 效果都一样的String endpoint = "http://180.76.147.120:8989/Service1.asmx?wsdl";String[] res = null;        //webService 命名空间String nameSpace = "http://dengsss.org/";  // 查询所有数据的接口方法名String operationName = "selectAllOrder_Record";String soapAction = "http://dengsss.org/selectAllOrder_Record";// 定义service对象Service service = new Service();// 创建一个call对象Call call;try {call = (Call) service.createCall();// 设置目标地址,即webservice路径call.setTargetEndpointAddress(endpoint);// 设置操作名称,即方法名称call.setOperationName(new QName(nameSpace,operationName));//            // 此处需要配置传入参数类型与参数名称,如果未设置jax-ws则无法接受参数,会认为传入的参数为null//            call.addParameter(new QName(nameSpace, "TransNo"),//                    org.apache.axis.encoding.XMLType.XSD_STRING,//                    javax.xml.rpc.ParameterMode.IN);// 设置返回值类型// 对于返回是字符串数组的返回类型只有这两种可行call.setReturnClass(java.lang.String[].class);call.setUseSOAPAction(true);call.setSOAPActionURI(soapAction);try {res = (String[]) call.invoke(new Object[] {});} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 如果返回类型是org.apache.axis.encoding.XMLType.SOAP_VECTOR时用下面的转型接收// Vector v=(Vector) call.invoke(new Object[]{cityCode,userId});   } catch (ServiceException e) {// TODO Auto-generated catch blocke.printStackTrace();}return res;}


WebService端的接口方法已经存在,这里用axis方式调用需要的方法。

这里的方法返回的是字符串数组。

如果需要传入参数,那么就配置传入参数类型与参数名称,

因为我是需要把本地数据库的数据传到websevice的数据库并存起来,传输的方式为把本地数据库的数据导出存为一个XML格式文件,然后再把这个XML文件转化成字符串,并把它作为传递的参数,在这个过程中主要有两歩:

1.把数据库表中数据导出存为xml格式文件,代码如下:

<pre name="code" class="java">import java.io.File;import java.io.FileOutputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;/** * 导出数据库的数据并存为xml格式文件 * @author Administrator * */public class TestDB2Xml {   public static void main(String[] args) {   String str_query;PreparedStatement pstmt;ResultSet rs;    List<String[]> result = new ArrayList<String[]>();    String line[]= null;    String JDRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";String  connectDB="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=iODH_DataBase";try {Class.forName(JDRIVER);}catch (ClassNotFoundException e) {//e.printStackTrace();System.out.println("加载数据库引擎失败fff");System.exit(0);} try {        Connection con = DriverManager.getConnection(connectDB, "sa", "666666");// 连接数据库对象        str_query = "SELECT * FROM Order_Record";        pstmt = con.prepareStatement(str_query);        rs = pstmt.executeQuery();            while(rs.next()) {    //定义一个String数组,这个数组中存取每条工单记录的每个数据      line = new String[10];      line[0] = rs.getString(1);      line[1] = rs.getString(2);      line[2] = rs.getString(3);      line[3] = rs.getString(4);      line[4] = rs.getString(5);      line[5] = rs.getString(6);      line[6] = rs.getString(7);      line[7] = rs.getString(8);      line[8] = rs.getString(9);      line[9] = rs.getString(10);      result.add(line);   //把每一条工单数据存到result容器中    }    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();    DocumentBuilder builder=factory.newDocumentBuilder();    //新建一个document对象    Document document=builder.newDocument();//Creat xml document    document.setXmlVersion("1.0");    Element root=document.createElement("orderList");//rootname of xml document    document.appendChild(root);//creat root of xml document    for(int k=1; k<=result.size(); k++) {    root.appendChild(document.createElement("DOrder_Record"));//elementname of xml document    }    NodeList nodeList=document.getElementsByTagName("DOrder_Record");      int size=nodeList.getLength();    for(int k=0; k<size; k++) {    Node node=nodeList.item(k);     if(node.getNodeType()==Node.ELEMENT_NODE) {    String[] temp = (String[])result.get(k);    Element elementNode=(Element)node;    //把前面result容器中的数据对应加入到节点当中,注意!!目前如果数据库中某列有null值,那边这边就会报错,需要进行判定    for (int i = 0; i < temp.length; i++) {    if (temp[i] == null) {    temp[i] = "";               //变为""值后,WebServer端接收到数据后不能存入数据库    }    }    //为每个工单增加具体属性节点,并给每个节点赋值    elementNode.appendChild(document.createElement("Order_ID")).appendChild(document.createTextNode(temp[0]));    elementNode.appendChild(document.createElement("Order_Type")).appendChild(document.createTextNode(temp[1]));    elementNode.appendChild(document.createElement("Site_Addr")).appendChild(document.createTextNode(temp[2]));    elementNode.appendChild(document.createElement("East_Longitude")).appendChild(document.createTextNode(temp[3]));    elementNode.appendChild(document.createElement("North_Latitude")).appendChild(document.createTextNode(temp[4]));    elementNode.appendChild(document.createElement("Worker_Name")).appendChild(document.createTextNode(temp[5]));    elementNode.appendChild(document.createElement("Finshin_Staut")).appendChild(document.createTextNode(temp[6]));    elementNode.appendChild(document.createElement("Finshin_Date")).appendChild(document.createTextNode(temp[7]));    elementNode.appendChild(document.createElement("Device_ID")).appendChild(document.createTextNode(temp[8]));    elementNode.appendChild(document.createElement("Work_DateLine")).appendChild(document.createTextNode(temp[9]));    }     }    TransformerFactory transFactory=TransformerFactory.newInstance();    Transformer transformer=transFactory.newTransformer();    DOMSource domSource=new DOMSource(document);    File file=new File("OederRecord.xml");//save xml document as url    FileOutputStream out=new FileOutputStream(file);    StreamResult xmlResult=new StreamResult(out);    transformer.transform(domSource,xmlResult);    }catch(Exception e) {     System.out.println(e);    }}}

到这里,数据库取出的数据就被存为一个xml文件,
</pre><pre name="code" class="java">2.XML文件转化成字符串,代码如下
<pre name="code" class="java">        SAXReader reader = new SAXReader();          //读取XML文件,然后 转换成Document          Document document = reader.read(new File("OederRecord.xml"));          //document转换为String字符串          String documentStr = document.asXML();          System.out.println("document 字符串:" + documentStr); 

用dom4j的方式解析xml。

webserver端接受到字符串之后再进行处理。
当前这种方式中,出现一个错误,

AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server faultSubcode:  faultString: 服务器无法处理请求。 ---&gt; 未将对象引用设置到对象的实例。 faultActor:  faultNode:  faultDetail: <span style="white-space:pre"></span>{http://xml.apache.org/axis/}stackTrace:服务器无法处理请求。 ---&gt; 未将对象引用设置到对象的实例。<span style="white-space:pre"></span>at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)<span style="white-space:pre"></span>at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)<span style="white-space:pre"></span>at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1781)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2957)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:333)<span style="white-space:pre"></span>at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)<span style="white-space:pre"></span>at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)<span style="white-space:pre"></span>at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)<span style="white-space:pre"></span>at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)<span style="white-space:pre"></span>at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)<span style="white-space:pre"></span>at org.apache.axis.client.Call.invokeEngine(Call.java:2784)<span style="white-space:pre"></span>at org.apache.axis.client.Call.invoke(Call.java:2767)<span style="white-space:pre"></span>at org.apache.axis.client.Call.invoke(Call.java:2443)<span style="white-space:pre"></span>at org.apache.axis.client.Call.invoke(Call.java:2366)<span style="white-space:pre"></span>at org.apache.axis.client.Call.invoke(Call.java:1812)<span style="white-space:pre"></span>at ss.xml.WeatherWebService.uploadOrder_Record(WeatherWebService.java:143)<span style="white-space:pre"></span>at ss.xml.WeatherWebService.main(WeatherWebService.java:167)webserver端接受到字符串之后再进行处理。当前这种方式中,出现一个错误,
这个错误不影响数据的传到webserver,但还没有具体的解决办法<span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space: normal;"></span></span>

0 0
原创粉丝点击