JDK api下 SOAP 消息 ,以及 weblogic部署遇到的问题。

来源:互联网 发布:红极一时的网络歌曲 编辑:程序博客网 时间:2024/06/10 05:33

应该是有两种方法

1、使用WSDL,利用wsimport   命令创建接口类。然后调用。

2、手工写 soap 消息的创建 处理程序。

这次遇到的 WSDL文件,在wsimport命令下 报错,而且就是一个查询操作,所以就自己编写了个SOAP消息处理程序。

基本结构就是 创建SOAP消息,添加内容,发送消息,获取应答,处理结果

需要使用的类库

import java.net.URL;  
import java.util.Calendar;   
import javax.xml.soap.MessageFactory;  
import javax.xml.soap.SOAPBody;  
import javax.xml.soap.SOAPConnection;  
import javax.xml.soap.SOAPConnectionFactory;  
import javax.xml.soap.SOAPElement;  
import javax.xml.soap.SOAPEnvelope;  
import javax.xml.soap.SOAPMessage;  
import javax.xml.soap.SOAPPart;  
import javax.xml.transform.Source;  
import javax.xml.transform.Transformer;  
import javax.xml.transform.TransformerFactory;  
import javax.xml.transform.stream.StreamResult;  
import org.w3c.dom.Node; 
import java.io.IOException; 


import java.io.StringWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

消息处理程序

 try {  
 
         // 创建连接  
         // ==================================================  
         SOAPConnectionFactory soapConnFactory = SOAPConnectionFactory  
                 .newInstance();  
         SOAPConnection connection = soapConnFactory.createConnection();  


         //  创建消息对象  
         // ===========================================  
         MessageFactory messageFactory = MessageFactory.newInstance();  
         SOAPMessage message = messageFactory.createMessage();  
//       message.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "gb2312");  


         // 创建soap消息主体==========================================  
         SOAPPart soapPart = message.getSOAPPart();// 创建soap部分  
         SOAPEnvelope envelope = soapPart.getEnvelope();  
         envelope.addNamespaceDeclaration("adin", "http://3e.pl/ADInterface");
         //envelope.setAttribute("xmlns:adin","http://3e.pl/ADInterface");  这段setAttrbute 在javac下编译运行都可以,但是用到web servlet中就报错 找不到namespace
         SOAPBody body = envelope.getBody();  
         //  根据要传给mule的参数,创建消息body内容。具体参数的配置可以参照应用集成接口技术规范1.1版本  
         // =====================================  
      //   SOAPElement bodyElement = body.addChildElement(envelope.createName(  
       //          "process", "Request", "http://esb.service.com/"));  
        SOAPElement query = body.addChildElement("queryData","adin");  
           // body.addChildElement("adin:getVersion");
          SOAPElement modelElement= query.addChildElement("ModelCRUDRequest","adin");
         SOAPElement ModelCRUD = modelElement.addChildElement("ModelCRUD","adin");
         
            ModelCRUD.addChildElement("serviceType","adin").addTextNode("QueryAG_PlaintSummary");
ModelCRUD.addChildElement("TableName","adin").addTextNode("AG_PlaintSummary_V");
            ModelCRUD.addChildElement("RecordID","adin").addTextNode("0");
 
          
            SOAPElement DataRow = ModelCRUD.addChildElement("DataRow","adin");
            SOAPElement field = DataRow.addChildElement("field","adin");
          
          
          field.addAttribute(envelope.createName("type"), "String");
 
          field.addChildElement("val","adin").addTextNode("01420004000003380024");


  SOAPElement lookup = field.addChildElement("lookup","adin");
SOAPElement lv = lookup.addChildElement("lv","adin");
          lv.addAttribute(envelope.createName("val"), "?");
          lv.addAttribute(envelope.createName("key"), "?");


SOAPElement ADLoginRequest = modelElement.addChildElement("ADLoginRequest","adin");


ADLoginRequest.addChildElement("user","adin").addTextNode("System");
          ADLoginRequest.addChildElement("pass","adin").addTextNode("System");

// Save the message  
         message.saveChanges();  
    
          * 实际的消息是使用 call()方法发送的,该方法接收消息本身和目的地作为参数,并返回第二个 SOAPMessage 作为响应。 
          * call方法的message对象为发送的soap报文,url为mule配置的inbound端口地址。 
          */  
         URL url = new URL("http://10.110.0.131:9080/ADInterface/services/ModelADService");  
         
// 响应消息  
         // ===========================================================================  
         SOAPMessage reply = connection.call(message, url);  

         // ==================创建soap消息转换对象  转换成string 返回,正常应该解析消息,提取内容。
StringWriter sw = new StringWriter();
         TransformerFactory transformerFactory = TransformerFactory  
                 .newInstance();  
         Transformer transformer = transformerFactory.newTransformer();  
         // Extract the content of the reply======================提取消息内容  
         Source sourceContent = reply.getSOAPPart().getContent();  
         // Set the output for the transformation  
        StreamResult result = new StreamResult(sw); 
         //ByteArrayOutputStream  bos  =  new  ByteArrayOutputStream();
         transformer.transform(sourceContent, result);  
         // Close the connection 关闭连接 ==============  
        // System.out.println("");  


    sw.flush();
    sw.close();
    
         String xmlStr =  sw.toString();
         connection.close();  


  return xmlStr;
         /* 
          * 模拟客户端A,异常处理测试 
          */  
        // SOAPBody ycBody = reply.getSOAPBody();  
        // Node ycResp = ycBody.getFirstChild();  
        // System.out.print("returnValue:"+ycResp.getTextContent()); 
    
     } catch (Exception e) {  
         e.printStackTrace();  
         System.out.println(e.getMessage());  
         return "error:"+e.getMessage().toString();
     }  


复杂的soap消息,利用soapclient  调试 会更加容易。


在使用上述程序  在  tomcat 下是 没有问题 的,在 weblogic 下 就会 死的很惨了。。。。。。


3、所以 几经努力 找到了另一个 webligic  10.3 下 能用的 构建soap消息的方法。。。 

新建一个soap消息的xml 文档   soap.xml

使用dom的doc  对象解析  这个  xml文件 ,替换   掉  需要 查询的内容。

然后  将  doc  转换成string   ,利用  mimeheaders+ inputstream  构建  soap 消息。   

  MessageFactory messageFactory = MessageFactory.newInstance(); 
        MimeHeaders mmh = new MimeHeaders();
        mmh.setHeader("Content-Type", "text/xml");
        
        SOAPMessage message = messageFactory.createMessage(mmh,new ByteArrayInputStream(SoapStr.getBytes("UTF-8")));



需要在 构建soapmessage  消息的时候  设定  memiheaders  中的   content-type    text/xml

在解析的时候   也 无法 直接获取  soap消息中的 doc对象。

然后  又利用 string  转换了一下


研究的 不深,但总算 解决了 问题。


总之    weblogic  对  webservice的 支持   各种  乱。







0 1
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 双盘打坐膝痛腿脚心处紫青怎么办? 双盘打坐两膝盖不能着地怎么办? 做完蹲起之后腿疼的受不了怎么办 孩子游泳学不会不想去了怎么办 自由泳打腿走水但水花大怎么办 老师上课发现学生课上自慰怎么办 生完孩子腿粗屁股大怎么办 产后42天检查子宫偏大怎么办 崇拜瑜伽老师喜欢上他了怎么办 练瑜伽下不了腰贴不住腿怎么办 吃母乳宝宝吸的奶头疼怎么办 孩子吃奶把奶头咬破了怎么办 奶头边上让孩子咬破了吃奶疼怎么办 腰部受过伤久坐缓解腰疼怎么办 小孩八个月了还在软得很怎么办 产后第三天乳房胀痛有硬块怎么办 怀孕七个多月了胎位不正怎么办 怀孕6个月梅毒1:4怎么办 怀孕了胃酸胃涨吐酸水怎么办 怀孕了胃酸胃胀吐酸水怎么办 练瑜伽大腿外侧扭筋了怎么办 膝盖运动时疼痛睡觉不疼怎么办 在农村里床上老是有小蜈蚣该怎么办 瑜伽垫晒太阳后散发的甲醛怎么办 杯子盖上的皮垫子掉了漏水怎么办 20个月宝宝天天晚上不睡觉怎么办 八个月大小孩天天晚上不睡觉怎么办 如果开了光的貔貅不要了要怎么办 刚岀生的婴儿长得太快怎么办 呼市去办牌照时没有牌照怎么办 宾馆发现隐藏的摄像头怎么办报警吗 拍拍贷律师函寄到家里了怎么办 欠了拍拍贷本息一万多了怎么办 把人偷小孩的人贩子打死了怎么办 怀孕3个月没有胎心怎么办 社保局打印关系转移信封之后怎么办 长裙变装外出被发现了怎么办 超变陀螺怎么绳子拉不出来怎么办 梦幻诛仙传说时间得不到东西怎么办 夹在强势母亲和强势老公中间怎么办 工作调动校长总拖着不盖章怎么办