2009-06-25 3 views
0

이 문제는 며칠 동안 저를 괴롭 힙니다. 잘만되면 누군가가 이전에이 문제를 발견했으며 해결 방법을 개발했습니다.SoapAction Java 1.3의 문제

그래서 실행 중 SOAP 작업을 호출하는 미들웨어 Java 응용 프로그램을 개발했습니다. 이제, 1.6 JDK에서이 코드 비트의 동작은 잘 작동 :

 // inside a try-catch block 
     SOAPConnectionFactory soapConnectionFactory = 
        SOAPConnectionFactory.newInstance(); 
     SOAPConnection connection = 
        soapConnectionFactory.createConnection(); 
     MessageFactory messageFactory = MessageFactory.newInstance();   
     SOAPMessage soapMsg = messageFactory.createMessage(); 
     String soapAction = getHeaderUrl() + "/" + method + "\r\n"; 
     MimeHeaders headers = soapMsg.getMimeHeaders(); 
     headers.addHeader("SOAPAction", soapAction); 

     // review the SOAPAction header 
     int header_count = 
      soapMsg.getMimeHeaders().getHeader("SOAPAction").length; 
     out("SOAPActions (from Soap header): "); 
     if (header_count == 0) out ("No SOAPActions defined."); 
     for (int i=0; i<header_count; i++) 
      out("SOAPAction["+i+"] = \"" + 
       soapMsg.getMimeHeaders().getHeader("SOAPAction")[i] 
        + "\""); 


     SOAPPart soapPart = soapMsg.getSOAPPart();    
     StreamSource s = new StreamSource(new StringReader(msg)); 
     soapPart.setContent(s); 
     soapMsg.saveChanges(); 
     ByteArrayOutputStream req_bytes = new ByteArrayOutputStream(); 
     soapMsg.writeTo(req_bytes); 
     String req = new String(req_bytes.toByteArray());   
     SOAPMessage reply = connection.call(soapMsg, Url);  

을하지만, 내가 링크 된 SOAP 라이브러리를 1.3 또는 1.4 JDK에서이 동일한 코드를 사용하는 경우, 작품 위의 모든 /이/컴파일 을 실행합니다. 단, 헤더의 SOAPAction 필드가 공란 인 경우는입니다. 이상하게도, 헤더의 값 (머리글 설정 바로 다음 행)을 확인하면 적절한 값이 표시됩니다. 그러나 전선을 지나칠 때 필드는 비어 있습니다. 이것이 프로세서에 필요한 리소스를 나타내는 필드이므로 내 메시지가 문앞에서 돌아옵니다.

이전에이 문제가 발생 했습니까? 그렇다면 가능한 대안이 있습니까? (필요한 경우 I는 물론, 다른 라이브러리를 사용 기꺼이.)

UPDATE : 내 클래스 경로에

라이브러리는 같다은 다음과 같습니다

  • 의 Xerces (resolver.jar, 시리얼을 .JAR, xercesImpl.jar의, XML-apis.jar)
  • SAAJ (saaj.jar을)
  • 축 (
  • axis.jar
  • JAX-RPC (jaxrpc.jar을)
  • 표준 SOAP (은 activation.jar, mail.jar, soap.jar을, xerces.jar)
  • 커먼즈 로깅과 발견 미리

감사합니다!

답변

0

그것은 실제로 감독 또는 버그가있을 수도 있습니다처럼 보이지만 어떤 속도로 내 해결 방법은 수동으로 낮은 수준의 HTTP 물건을 처리했다, 즉 :

 URL u = new URL(Url); 
     URLConnection uc = u.openConnection(); 
     HttpURLConnection conn = (HttpURLConnection) uc; 

     conn.setDoOutput(true); 
     conn.setDoInput(true); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("SOAPAction", getHeaderUrl() + "/" + method); 
     conn.setRequestProperty("Content-type", "text/xml"); 

     OutputStream out = conn.getOutputStream(); 
     Writer wr = new OutputStreamWriter(out); 

     wr.write(msg); 
     wr.flush(); 
     wr.close(); 

     InputStream in = conn.getInputStream(); 
     String rsp=""; 
     int c; 
     while ((c = in.read()) != -1) { 
      System.out.write(c); 
      rsp = rsp.concat(String.valueOf((char)c)); 
     } 
     in.close(); 
     rsp = deSOAP(rsp); 
     response = response.fromXML(rsp); 
     return response; 

이가 훨씬 더 간결 밝혀 SOAP 기반 솔루션보다

0

특이한. 여러분은 SOAP 라이브러리에 링크하고 있다고 말합니다 - 정확히 어떤 라이브러리입니까?

CXF 나 JAX-WS-RI와 같은 다른 SOAP 스택을 사용해도 좋지만, 두 가지 중 하나가 Java 1.3을 지원한다면 놀랄 것입니다.

+0

감사합니다. JAX-WS-RI를 사용해 보겠습니다. 또한 초기 게시물에 라이브러리를 추가했습니다. –