2016-05-17 95 views
0

我想用一个简单的HttpServlet来管理另一个服务器的肥皂请求。 该请求只有一个byte []类型的参数(它是一个简单的字符串)。与Java HttpServlet的解组肥皂信封

相关代码:

@Override 
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    try { 
      InputStream is = req.getInputStream(); 
      byte[] body = IOUtils.toByteArray(is); 
      String stringRequest = new String(body); 
      log.info("Request -> "+stringRequest); 
     }catch(Exception){log.error(e);} 

我收到请求,如果我打印它似乎在这样:

<?xml version="1.0" encoding="UTF-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soapenv:Body> 
     <fixedResearch soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
      <MYPARAMETER xsi:type="xsd:hexBinary"> 
       *****bytearray****** 
      </MYPARAMETER> 
     </fixedResearch> 
    </soapenv:Body> 
</soapenv:Envelope> 

我需要得到MYPARAMETER标签内的值(这是一个字节[])。 有一个聪明的方法,也许使用Axis1的一些utils类(我不能使用Axis2)来处理传入的请求?

回答

2

我不确定您允许使用什么,但“手动”方式是使用XPath。下面的代码我跑了一次,它似乎工作。它没有利用名称空间,而是一个开始。你需要优化它 - 这只是一个例子,但我已经有99%的代码已经完成。

package tld.domainname.stuff; 


import java.io.IOException; 
import java.io.StringReader; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathExpressionException; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 


public class XPathTest { 
    public static void main(String[] argv) { 
     String xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + 
       "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + 
       " <soapenv:Body>\n" + 
       "  <fixedResearch soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">\n" + 
       "   <MYPARAMETER xsi:type=\"xsd:hexBinary\">\n" + 
       "    *****bytearray******\n" + 
       "   </MYPARAMETER>\n" + 
       "  </fixedResearch>\n" + 
       " </soapenv:Body>\n" + 
       "</soapenv:Envelope>"; 

     String value = null; 

     XPath xpath = XPathFactory.newInstance().newXPath(); 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = null; 
     Document doc = null; 
     try { 
      builder = factory.newDocumentBuilder(); 
     } catch (ParserConfigurationException e) { 
      e.printStackTrace(); 
     } 
     InputSource is = new InputSource(new StringReader(xmlString)); 
     try { 
      doc = builder.parse(is); 
     } catch (SAXException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     if (doc == null) { 
      System.out.println("can't parse doc"); 
      return; 
     } 

     Node parentNode = doc.getDocumentElement(); 

     String path = "Body/fixedResearch/MYPARAMETER"; 

     NodeList nodeList; 
     try { 
      nodeList = (NodeList) xpath.evaluate(path, parentNode, XPathConstants.NODESET); 
     } catch (XPathExpressionException xpe) { 
      throw new IllegalArgumentException("Cannot evaluate xpath with path \"" + path + "\"", xpe); 
     } 

     if ((nodeList == null) || (nodeList.getLength() == 0)) { 
      System.out.println("found nothing"); 
      return; 
     } 

     if (nodeList.getLength() > 1) 
      System.out.println("found " + nodeList.getLength() + " nodes in the path \"" + path + "\" - using only the first"); 

     Node nextNode = nodeList.item(0); 

     if (nextNode == null) { 
      System.out.println("found nothing"); 
      return; 
     } 

     if (nextNode.hasChildNodes()) { 
      Node child = nextNode.getFirstChild(); 
      value = child.getNodeValue(); 
     } 

     System.out.println("found value of \"" + value + "\""); 
    } 
} 
+0

几乎完美的一部分,MYPARAMETER的内容是hexBinary。所以要打印正确的值,你应该做新的String(hexStringToByteArray(value))。我省略了hexStringToByteArray的实现,因为我在评论中没有足够的字符。 – drenda