2012-03-27 2 views
3

아파치 축을 사용하는 Java 프로그램에서 SOAP 호출을해야합니다. 내 프로그램은 다음과 같다 : 다음과 같이 실행에 형식에 대한 디시리얼라이저를 찾을 수 없습니다. 오류

import org.apache.axis.client.Call; 
import org.apache.axis.client.Service; 
import javax.xml.rpc.ParameterMode; 
import javax.xml.namespace.QName; 
public class Project { 
    public static void main(String [] args) { 

    try { 

     String endpoint ="http://RequestUrl"; 
     Service service = new Service(); 
     Call call = (Call) service.createCall(); 
     call.setTargetEndpointAddress(new java.net.URL(endpoint)); 
     call.setOperationName(new QName(endpoint, "getFrsFileData")); 
     String value = (String) call.invoke(new Object[] { "24BB7","frs1001" }); 
     System.out.println(value); 
     } 

    catch (Exception e) { 
     System.err.println(e.toString()); 
     } 

    } 
    } 

이 오류를 제공

  • 예외 : 는 org.xml.sax.SAXException : 직렬화 복원 매개 변수 'getFrsFileDataReturn'찾을 수 없습니다 {http : // Url} FrsFileSoapDO (org.apache.axis.message.RPCHandler.onStartChild (RPCHandler.java:277))의 디시리얼라이저 at org.apache.axis.encoding.DeserializationContext.startElement (DeserializationContext.java:1035)) at org.apache.axis.message.SAX2EventRecorder.replay (SAX2EventRecorder.java:165) at org.apache.axis.message.MessageElement.publishToHandler (MessageElement.java:1141) at org.apache.axis.message. RPCElement.deserialize (RPCElement.java:345) at org.apache.axis.message.RPCElement.getParams (RPCElement.java:384) at org.apache.axis.client.Call.invoke (Call.java:2467) at org.apache.axis.client.Call.invoke (Call.java:2366) at org.apache.axis.client.Call.invoke (Call.java:1812) at Project.main (Project.java : 33) org.xml.sax.SAXException : deserializing 매개 변수 'getFrsFileDataReturn': {http : // Url} 형식의 디시리얼라이저를 찾을 수 없습니다. FrsFileSoapDO

SOAPUI를 사용하여 동일한 호출을 시도했지만 디버깅에 도움이되지 않았습니다.

이 자바 코드를 디버깅에 저를 도와주세요,

당신

답변

5

내 친구의 도움을 얻고 답에 도달 할 수 있었다 감사드립니다. 문제는 비누 호출이 "FrsFileSoapDO"유형의 빈으로 제공되는 비누 응답을 제공한다는 것입니다. 내 프로그램이 수신 된 빈을 어떻게 이해하는지에 대한 코드에서 아무것도주지 않았기 때문에 "{http://Url}FrsFileSoapDO 유형의 디시리얼라이저를 찾을 수 없습니다"라는 오류가 발생했습니다. 이제 문제를 해결하는 단계는

1) "FrsFileSoapDO"가 참조하는 네임 스페이스가 무엇인지 말하는 "QName"을 만듭니다.

2) 그) 빈을 직렬화하는 방법을 알고있다 (콩 시리얼을 생성,

3

)

4

)가 말하는 매핑을 수행, 즉) 빈을 역 직렬화하는 방법을 알고 (A 콩 디시리얼라이저를 만들 QName q는 FrsFileSoapDO.class 클래스에 매핑됩니다 (이전에 FrsFileSoapDO.class를 가지고 있고 가져 왔는지 확인하십시오)

이제 이것을 try 블록 만 반복합니다. 여기)

try { 

    String endpoint ="http://RequestUrl"; 
    Service service = new Service(); 
    Call call = (Call) service.createCall(); 
    call.setTargetEndpointAddress(new java.net.URL(endpoint)); 

    QName q = new QName ("http://Url", "FrsFileSoapDO"); // step 1 
    BeanSerializerFactory bsf = new BeanSerializerFactory(FrsFileSoapDO.class,q); // step 2 
    BeanDeserializerFactory bdf = new BeanDeserializerFactory(FrsFileSoapDO.class,q); // step 3 
    call.registerTypeMapping(FrsFileSoapDO.class,q, bsf, bdf); //step 4 

    call.setOperationName(new QName(endpoint, "getFrsFileData")); 
    FrsFileSoapDO s = (FrsFileSoapDO) call.invoke(new Object[] { "24BB7","frs1001" }); 
    System.out.println(s.getFilename()); 
    } 

예상되는 출력을 얻는 데 효과적입니다.기능 통화, BeanSerializerFactory, BeanDeserializerFactory에 대한

이 문서는 내가 같은 문제에 직면했다 BeanSerializerFactoryBeanDeserializerFactory

0

에서 사용할 수 있습니다. 내가 코드에서 생각하는 유일한 실수는 라인 아래 : 당신의 QName 생성자 매개 변수에 대한 엔드 포인트를 사용하지 말아야

call.setOperationName(new QName(endpoint, "getFrsFileData")); 

. 문자열 매개 변수 만 전송하는 경우 비워 두어도되지만 복잡한 데이터의 경우에는 wsdl 파일에서 매핑을 제공해야합니다. 이 웹 서비스 메서드의 wsdl 파일에서 매개 변수를 확인하고 여기에 동일한 매핑을 지정하십시오. 당신이지도를 정의하기 위해 필요한이 후

call.setOperationName(new QName("apachesoap:MatrixService", "sendFile")); 
QName fileAttachment = new QName("apachesoap:MatrixService", "DataHandler"); 

: 당신은 같은 동일한 유형을 줄이

<wsdl:message name="sendFileRequest"> 
    <wsdl:part name="in0" type="apachesoap:DataHandler"/> 
    <wsdl:part name="in1" type="soapenc:string"/> 
</wsdl:message> 

와 클라이언트 코드 : 나를 위해 예를 들어 파일 WSDL의 항목이 있었다 있도록 전송했다 registerTypeMapping을 사용하여 동일한 경우.

관련 문제