Axis2 서비스에서 생성된 WSDL은 SoapUI 또는 WSDL2Java에서 읽을 수 없습니다.
-
20-09-2019 - |
문제
일부 서비스를 Apache SOAP에서 Axis2로 변환 중이므로 Java 서비스 클래스가 이미 존재합니다.Eclipse에서 새 프로젝트를 생성하고 소스를 가져온 다음 Axis2 프로젝트 패싯이 설치되었는지, Axis2 이미터 속성이 올바른지 확인했습니다.그런 다음 Eclipse에서 서비스 클래스를 선택하고 "웹 서비스 생성"을 선택하여 Axis2 런타임을 선택했습니다.서비스가 내 PC에서 실행되고 있으며 서비스 경로에 "?wsdl"을 추가하면 실제로 로컬에 저장하는 WSDL을 얻게 됩니다.클라이언트를 빌드하기 위해 이를 SoapUI로 가져오려고 하면 오류가 발생합니다.
ERROR:org.apache.xmlbeans.XmlException: C:\projects\soapUI\Axis2\DALService.wsdl:0: error: src-resolve: type 'SOAPException@http://www.w3.org/2001/XMLSchema' not found.
참조하는 유형(SOAPException)은 Apache SOAP 서비스의 보류이며 서비스 코드에서 서비스 코드(WSDL 아님)의 모든 "가져오기" 참조를 다음에서 변경했습니다. org.apache.soap.SOAPException
(이전 Apache SOAP 패키지 이름) javax.xml.soap.SOAPException
(Axis2 위치).코드에 액세스할 수 있으면 코드가 컴파일되고 작동하지만 클라이언트를 생성하지 않으면 액세스할 수 없습니다.객체의 네임스페이스를 변경하면 생성된 WSDL이 적절한 네임스페이스 참조를 갖지 못하게 되는 이유에 대해 어떻게 생각하시나요?
해결책 2
왜 이런 일이 발생하는지 처음으로 말씀드리고 싶습니다. 하지만 제 생각에는 네임스페이스의 정확한 내용은 모두 동일하다면 중요하지 않을 수 있습니다.SOAPException은 일반 예외만 맹목적으로 확장하기 때문에 SOAPException의 특별한 기능도 사용하지 않습니다.어쨌든 세 가지 작업을 수행하여 SoapUI를 사용하여 XML에서 클라이언트를 구축할 수 있었습니다.
먼저 다음과 같이 SOAPException 자체를 나타내는 섹션을 추가했습니다.
<xs:schema xmlns:test="http://service.PROJECT.DEPARTMENT.COMPANY.com" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://DEPARTMENT.COMPANY.com/xsd">
<xs:import namespace="http://service.PROJECT.DEPARTMENT.COMPANY.com"/>
<xs:complexType name="SOAPException">
<xs:complexContent>
<xs:extension base="ns:Exception">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
둘째, wsdl:definitions 블록에 다음 네임스페이스를 추가했습니다.
xmlns:im="http://DEPARTMENT.COMPANY.com/xsd"
셋째, SOAPException 기본 유형(fron)을 참조하는 네임스페이스를 변경했습니다. ns
에게 im
여기) 이전에 참조되었던 곳은 다음과 같습니다.
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.ims.im.sa.homedepot.com/xsd">
<xs:complexType name="SOAPLocatorException">
<xs:complexContent>
<xs:extension base="im:SOAPException">
<xs:sequence>
<xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="messageCode" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
XML 파일은 여전히 XMLSpy에서 명확하게 유효성을 검사하지 않지만 나에게 직접 영향을 주지 않는 좀 더 난해한 이유 때문입니다(Soap11 및 Soap12 바인딩에 대해 정의된 오류가 있는 작업에는 원시 HTTP 바인딩).
작동하더라도 다음 사항에 대해 여전히 약간 혼란스럽습니다.
- Axis2가 SoApexception 유형에 대해 알고 있다면 (그리고 다른 예외의 기본 클래스로 언급했기 때문에) 왜 그것을
xs:schema
차단하다? - 같은 줄을 따라 다른 유형의 기본 클래스로 사용할 때 왜 잘못된 네임 스페이스에서 클래스를 참조 했습니까?
- 이 유형의 네임 스페이스를 다음과 같이 설정 해야하는 이유
DEPARTMENT.COMPANY.com
Axis2 패키지 나 서비스 객체의 패키지가 아닌가?
다른 팁
SOAP UI에 WSDL을 직접 표시 한 "XXX? WSDL"URL을 사용하면 WSDL에 언급 된 일부 XSD 스키마가 SOAP UI 도구에서 찾을 수없는 것처럼 보입니다. 일반적으로 이러한 도구는 동일한 폴더에서 스키마를 검색하십시오. org.apache.soap.soapexception to javax.xml.soap.soapexception이 있으므로 네임 스페이스가 변경되었을 수 있습니다.
완전한 URL을 사용해보고 결과를 확인하십시오.