문제

이 문제는 며칠 동안 나를 괴롭 혔습니다. 바라건대 누군가가 전에 이것을 발견했고 해결 방법을 개발했기를 바랍니다.

그래서 나는 실행 중에 비누 작업을 호출하는 미들웨어 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 에서이 동일한 코드를 사용하면 위의 모든 것이 작품/컴파일/실행, 헤더의 비누가 비어 있다는 사실을 제외하고. 이상하게도, 해당 헤더의 값이 무엇인지 확인하면 (헤더 설정 직후) 적절한 값이 표시됩니다. 그러나 와이어를 넘어 가면 필드가 비어 있습니다. 이것이 프로세서에 원하는 리소스를 나타내는 필드이므로 내 메시지가 문에서 돌아오고 있습니다.

전에이 문제를 겪은 사람이 있습니까? 그렇다면 해결 방법이 있습니까? (물론 필요한 경우 다른 도서관을 기꺼이 사용하려고합니다.)

업데이트:

내 클래스 경로의 라이브러리는 다음과 같습니다.

  • xerces (resolver.jar, serializer.jar, xercesimpl.jar, xml-apis.jar)
  • Saaj (saaj.jar)
  • 축 (Axis.jar
  • jax-rpc (jaxrpc.jar)
  • 표준 비누 (activation.jar, mail.jar, soap.jar, xerces.jar)
  • 커먼즈 로깅 및 발견

미리 감사드립니다!

도움이 되었습니까?

해결책 2

이것은 실제로 감독이나 버그 일 수있는 것처럼 보이지만, 내 해결 방법은 하위 수준의 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;

이것은 비누 기반 솔루션보다 훨씬 간결합니다.

다른 팁

이상한. 비누 라이브러리에서 연결하고 있다고 말합니다. 정확히 어떤 것입니까?

CXF 또는 JAX-WS-RI와 같은 다른 비누 스택을 시도하는 것은 아프지 않을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top