2010-03-22 1 views
4

방금 ​​웹 서비스 공급자와 작동하지 않는 축과 Eclipse를 사용하여 웹 서비스 클라이언트를 만들었습니다. 축 생성 된 웹 서비스에서 네임 스페이스 선언을 페이로드에서 봉투로 이동

<?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> 
    <enviarMensajeRequest 
     xmlns="http://www.springframework.org/spring-ws/Imk-Zenkiu-Services"> 
     <usuario>someuser</usuario> 
     <clave>somepassword</clave> 
     <mensaje>somemessage</mensaje> 
     <contacto> 
     <buzonSMS>somenumber</buzonSMS> 
     <primerNombre>somefirstname</primerNombre> 
     <primerApellido>somelastname</primerApellido> 
     </contacto> 
    </enviarMensajeRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

내가 메시지와 함께 잘못된 아무것도 볼하지만 내 공급자는 메시지가 있어야한다 주장 : 웹 서비스 클라이언트에 의해 생성 된 메시지는 다음과 같습니다

<?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" 
    xmlns:imk="http://www.springframework.org/spring-ws/Imk-Zenkiu-Services"> 
    <soapenv:Body> 
    <imk:enviarMensajeRequest> 
     <imk:usuario>someuser</imk:usuario> 
     <imk:clave>somepassword</imk:clave> 
     <imk:mensaje>somemessage</imk:mensaje> 
     <imk:contacto> 
      <imk:buzonSMS>somenumber</imk:buzonSMS> 
      <imk:primerNombre>somefirstname</imk:primerNombre> 
      <imk:primerApellido>somelastname</imk:primerApellido> 
     </imk:contacto> 
    </imk:enviarMensajeRequest> 
    </soapenv:Body> 
</soapenv:Envelope> 

을 주목 enviarMensajeRequest에서 이동 네임 스페이스 선언 soapenv:Envelope으로, 매개 변수에 imk:의 자격을 부여합니다. 이 과정에서 많은 조합을 시도했지만 웹 서비스, wsdl 및 xml 지식은 매우 제한적입니다. 공급자는 나에게이 말을하는 것 이상의 도움을 줄 수 없다고 말합니다. 어떤 아이디어? 아마도 올바른 클라이언트를 만드는 데 사용할 수있는 다른 프레임 워크 일 것입니다.

+0

귀하의 공급자가 올바르지 않습니다, 그들은 의미와 동일입니다. 축은 이것을 알고 있으며 자신이 생각하는 것이 최선입니다. 좋은 이유가 없으므로이 방법을 쉽게 변경할 수있는 방법이 없습니다. – skaffman

+0

감사합니다. 손으로 전체 전화를하는 것 외에이 방법에 접근하는 방법에 대한 아이디어가 있습니까? – rmarimon

+1

@skaffman, 답장을 보내 주셔서 감사합니다. 그러나 축이 이와 같이하지 못하도록하는 방법이 있습니다. 그렇지 않다면 서버 공급자에게 서버를 수정하도록 요청할 것입니다. –

답변

8

공급자가 잘못되었으므로 메시지가 의미 상 동일합니다. 너의 것이 자격이 없다, 그들의 자격이있다. Axis 또는 Axis2를 사용하고 있습니까? Axis를 사용하는 경우 Axis2로 전환하여보다 강력하고 표준에 부합하는 SOAP 스택을 생성하는 것이 좋습니다 (두 제품 모두 나쁘지 만 Axis2는 나쁘지 않습니다).

wsdl2java로 클라이언트를 생성한다고 가정합니다. 이 도구로 원하는대로 메시지를 생성 할 수 없다면 프로그래밍 방식으로 메시지를 생성하는 것이 가장 좋습니다. Axis2를 사용하면 AXIOM API로이를 수행 할 수 있습니다. API 사용 예제는 this link을 참조하십시오. 대부분의 방법, 예를 들어 createOMElement, 선택적으로 네임 스페이스 접두사를 전달합니다. 따라서 공급자가 필요로하면 namespacePrefix 매개 변수로 "imk"가 포함 된 String을 전달할 수 있습니다.


프로그래밍 방식으로이 일을 끝내고 만, 간단한 클라이언트를 작성해야하기 위하여려고하는 경우에 나는 강력히이 부분 당신이 대신 JAX-WS 스택을 축/Axis2는 접근 방식을 포기하고 사용하는 것이 좋습니다 Java 1.6 이후. API가 더 깨끗하고 문서가 더 좋습니다. 예를 들어, 다음은 JIRA 서버에 SOAP 요청을 보내기 위해 작성한 매우 간단한 클라이언트입니다. 샘플 코드는 규정 된 요소와 규정되지 않은 요소를 모두 작성합니다.

QName port = new QName(endpoint, "subversionsoapservice-v2"); 
QName serviceName = new QName(endpoint, "ISubversionSoapServiceService"); 

Service service = Service.create(serviceName); 
service.addPort(port, SOAPBinding.SOAP11HTTP_BINDING, endpoint); 

Dispatch<SOAPMessage> dispatch = service.createDispatch(port, SOAPMessage.class, Service.Mode.MESSAGE); 
MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); 
SOAPMessage request = factory.createMessage(); 
SOAPBody body = request.getSOAPBody(); 

SOAPElement reindexRepository = body.addChildElement("reindexRepository", "jira", "http://soap.ext.plugin.jira.atlassian.com"); 
SOAPElement in0 = reindexRepository.addChildElement("in0"); 
in0.addTextNode("test"); 

request.saveChanges(); 
dispatch.invoke(request); 

클라이언트에 의해 전송 된 XML은 다음과 같습니다

<?xml version="1.0"?> 
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Body> 
     <jira:reindexRepository xmlns:jira="http://soap.ext.plugin.jira.atlassian.com"> 
      <in0>test</in0> 
     </jira:reindexRepository> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 
+3

정말 대단 했어. 고마워. 다른 사용자의 경우 SOAP 헤더의 네임 스페이스 선언을 다음과 같이 설정할 수 있습니다. SOAPMessage request = factory.createMessage(); SOAPEnvelope envelope = request.getSOAPPart(). getEnvelope(); envelope.addNamespaceDeclaration ("uri", "uri : foo.bar.com"); SOAPBody body = request.getSOAPBody(); 다음과 같은 네임 스페이스 접두사를 사용하여 요소를 만듭니다. SOAPBody body = request.getSOAPBody(); SOAPElement ping = body.addChildElement ("foo", "uri");' – user326608