2016-08-12 18 views
6

Tôi đang tạo một ứng dụng Soap trong java và tôi đang gặp một lỗi lạ.SOAPExceptionImpl Phản hồi không hợp lệ: 404Không tìm thấy nếu tôi không làm soapMessage.writeTo (System.out);

Tóm tắt client

public abstract class AbstractSoapClient { 

    private ServerContext context; 

    private String path; 

    private static final String WSSE = ""; 
    private static final String CURL = ""; 
    private static final String CURL_PASSWORD = ""; 
    private static final String SECURITY_NODE = ""; 
    private static final String USERNAME_TOKEN = ""; 
    private static final String USERNAME_NODE = ""; 
    private static final String PASSWORD_NODE = ""; 

    public AbstractSoapClient(ServerContext context) { 
     this.context = context; 
    } 

    protected SOAPMessage createRequest(String path) throws SOAPException { 
     this.path = assembleEndpoint(path); 
     SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance(); 
     SOAPConnection soapConnection = soapConnectionFactory.createConnection(); 
     SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(), this.path); 
     soapConnection.close(); 
     return soapResponse; 
    } 

    protected void setCredentials(SOAPEnvelope envelope) throws SOAPException { 
     SOAPHeader tHeader = envelope.getHeader(); 
     Name tWsseHeaderName = envelope.createName(SECURITY_NODE, WSSE, CURL); 

     SOAPHeaderElement tSecurityElement = tHeader.addHeaderElement(tWsseHeaderName); 
     tSecurityElement.setMustUnderstand(false); 

     Name tUserTokenElementName = envelope.createName(USERNAME_TOKEN, WSSE, CURL); 
     SOAPElement tUserTokenElement = tSecurityElement.addChildElement(tUserTokenElementName); 
     tUserTokenElement.removeNamespaceDeclaration(WSSE); 
     tUserTokenElement.addNamespaceDeclaration("wsu", CURL); 
     // user name child 
     Name tUsernameElementName = envelope.createName(USERNAME_NODE, WSSE, CURL); 
     SOAPElement tUsernameElement = tUserTokenElement.addChildElement(tUsernameElementName); 
     tUsernameElement.removeNamespaceDeclaration(WSSE); 
     tUsernameElement.addTextNode(context.getUsername()); 

     // password child 
     Name tPasswordElementName = envelope.createName(PASSWORD_NODE, WSSE, CURL); 
     SOAPElement tPasswordElement = tUserTokenElement.addChildElement(tPasswordElementName); 
     tPasswordElement.removeNamespaceDeclaration(WSSE); 
     tPasswordElement.setAttribute("Type", CURL_PASSWORD); 
     tPasswordElement.addTextNode(context.getPassword()); 
    } 

    private String assembleEndpoint(String path) { 
     return context.getUrl().concat(path); 
    } 

    protected abstract SOAPMessage createSOAPRequest() throws SOAPException; 

    public ServerContext getContext() { 
     return context; 
    } 

    public String getPath() { 
     return path; 
    } 

} 

thực hiện Xà phòng Khách hàng

public class SoapClient extends AbstractSoapClient { 

    public SoapClient(ServerContext context) { 
     super(context); 
    } 

    @Override 
    public SOAPMessage createSOAPRequest() throws SOAPException { 
     MessageFactory messageFactory = MessageFactory.newInstance(); 
     SOAPMessage soapMessage = messageFactory.createMessage(); 
     SOAPPart soapPart = soapMessage.getSOAPPart(); 
     SOAPEnvelope envelope = soapPart.getEnvelope(); 
     setCredentials(envelope); 
     buildBody(envelope); 
     soapMessage.saveChanges(); 
     try { 
      soapMessage.writeTo(System.out); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return soapMessage; 
    } 

    private void buildBody(SOAPEnvelope envelope) throws SOAPException { 
     envelope.addNamespaceDeclaration("sch", "------"); 
     SOAPBody soapBody = envelope.getBody(); 
     SOAPElement soapBodyElem = soapBody.addChildElement("sampleData", "sampleData"); 
     SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("sampleData"); 
     soapBodyElem1.addTextNode("sampleData"); 
     SOAPElement soapBodyElem2 = soapBodyElem.addChildElement("sampleData"); 
     soapBodyElem2.addTextNode("sampleData"); 
     SOAPElement soapBodyElem3 = soapBodyElem.addChildElement("sampleData"); 
     soapBodyElem3.addTextNode("Y"); 
     SOAPElement soapBodyElem4 = soapBodyElem.addChildElement("sampleData"); 
     soapBodyElem4.addTextNode("sampleData"); 
     SOAPElement soapBodyElem5 = soapBodyElem.addChildElement("sampleData"); 
     soapBodyElem5.addTextNode("sampleData"); 
     SOAPElement soapBodyElem6 = soapBodyElem.addChildElement("sampleData"); 
     soapBodyElem6.addTextNode("sampleData"); 
    } 

    public static void main(String[] args) throws SOAPException, IOException { 
     SoapClient client = new SoapClient(
       new ServerContext("url", "user", "password")); 
     SOAPMessage response = client.createRequest("endpoint"); 
     response.writeTo(System.out); 
    } 

} 

Điểm lạ là trong phần này của mã:

try { 
       soapMessage.writeTo(System.out); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

Nếu tôi comm ent mã này mà chỉ in theo yêu cầu trước khi gửi nó tôi nhận được ngoại lệ tiếp theo:

ago 12, 2016 12:58:17 PM com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection post 
    GRAVE: SAAJ0008: respuesta errónea; Not Found 
    Exception in thread "main" com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (404Not Found 
     at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:149) 
     at 
AbstractSoapClient.createRequest(AbstractSoapClient.java:44) 
     at SoapClient.main(SoapClient.java:67) 
    Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (404Not Found 
     at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:264) 
     at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:145) 
     ... 2 more 

    CAUSE: 

    com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Bad response: (404Not Found 
     at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:264) 
     at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:145) 
     at AbstractSoapClient.createRequest(AbstractSoapClient.java:44) 
     at SoapClient.main(SoapClient.java:67) 

Nhưng nếu tôi không bình luận dòng này, tôi có thể nhận được câu trả lời một cách chính xác, đối với tôi những không có ý nghĩa vì tại sao nó gửi 404Không tìm thấy nếu tôi không viết yêu cầu trong bảng điều khiển trước khi gửi.

Trả lời

1

Nếu bạn kiểm tra writeTo implementation, bạn sẽ thấy rằng họ thêm tiêu đề SOAPAction.

Hãy thử như sau:

MessageFactory messageFactory = MessageFactory.newInstance(); 
SOAPMessage soapMessage = messageFactory.createMessage(); 
soapMessage.getMimeHeaders().addHeader("SOAPAction", "\"\""); 

Hy vọng nó giúp.

+0

Nhưng tại sao một phương pháp writeTo mà chỉ in theo yêu cầu trong một dòng thêm tiêu đề vào tin nhắn, Đó là thực sự là một thực hành tốt? –

+0

Tôi biết nó có vẻ kỳ lạ, và chắc chắn không phải là một thực hành tốt, tuy nhiên mã nguồn MessageImpl.writeTo làm điều đó. – fernandospr

0

Theo mặc định, giao diện SOAPMessage được triển khai bởi SoapMessageImpl. Việc triển khai này có tác dụng phụ khi thêm tiêu đề SOAPAction nếu nó không có mặt.

Sau khi gọi đến writeTo, bạn có thể loại bỏ nó bằng cách gọi:

soapMessage.getMimeHeaders().removeHeader("SOAPAction"); 

Có nói rằng, thay vì bổ sung thêm mã duy nhất để ghi lại các cuộc gọi và trả lời, tôi đề nghị sử dụng một proxy để thay thế.

Nếu bạn đang sử dụng Eclipse, hãy nhìn vào các TCP/Monitor View

Các vấn đề liên quan