Soap ไม่ได้ส่งฟิลด์ตอบกลับไปยังวัตถุที่พิมพ์

ฉันเป็น SOAP newb ที่ได้รับมอบหมายให้รื้อฟื้นอินเทอร์เฟซสบู่เก่า ฉันได้ย้ายบริการสบู่ไปยัง Tomcat ตัวใหม่ในเส้นทางใหม่ (และปล่อยให้ไคลเอนต์ไม่เปลี่ยนแปลง) ฉันส่งคำขอ: http://myserver:8181/soap/SoapTest?wsdl และฉันได้รับกลับมา:

  <wsdl:definitions xmlns:ns1="http://webservices.mycompany.com"
    xmlns:ns3="http://schemas.xmlsoap.org/wsdl/soap/http"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://www.mycompany.com/SoapTest"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    name="SoapTestService" 
    targetNamespace="http://www.mycompany.com/SoapTest">

    <wsdl:import location="http://myserver:8181/soap/SoapTest?wsdl=SoapTest.wsdl"
          namespace="http://webservices.mycompany.com"></wsdl:import>
    <wsdl:binding name="SoapTestServiceSoapBinding" type="ns1:SoapTest">...</wsdl:binding>
    <wsdl:service name="SoapTestService">...</wsdl:service>
  </wsdl:definitions>

ดูเหมือนว่าจะมีแนวโน้ม คำขอไปยังตำแหน่งนำเข้า SoapTest?wsdl=SoapTest.wsdl ส่งคืน:

<wsdl:definitions xmlns:ns1="http://webservices.mycompany.com"
  xmlns:ns2="http://jaxb.dev.java.net/array" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
  name="SoapTest"
  targetNamespace="http://webservices.mycompany.com">
  <wsdl:types>
    <xs:schema xmlns:tns="http://webservices.mycompany.com"
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://webservices.mycompany.com" version="1.0">
    <xs:complexType name="sessionObj">
      <xs:sequence>
        <xs:element name="code" type="xs:int"/>
        <xs:element name="id" type="xs:long"/>
        <xs:element minOccurs="0" name="role" type="xs:string"/>
        <xs:element minOccurs="0" name="username" type="xs:string"/>
      </xs:sequence>
    </xs:complexType>
    ... (and so on)

ดังนั้นลูกค้าสามารถรับการเชื่อมโยงสมาชิก xs name:type ได้ แต่ดูเหมือนว่าจะไม่ใช่ - หรือจะไม่นำไปใช้ นั่นคือ ...

หึหึ.. จากการตรวจสอบ ฉันเห็นว่า xs ถูกใช้เป็นเนมสเปซ แต่ xmlns:xsd ถูกกำหนดไว้?? สิ่งนี้จะเกิดขึ้นได้อย่างไร

ข้อความค้นหาไคลเอนต์ ZSI (จาก Windows หากสร้างความแตกต่าง) ไปยังอินเทอร์เฟซนี้ (Linux) ได้รับการตอบกลับที่มีเพย์โหลดข้อมูลที่คาดหวัง แต่จากนั้นแมปแต่ละรายการข้อมูลลงใน "คุณสมบัติ" แต่ละรายการ - ส่งผลให้เกิดรายการคุณสมบัติทั่วไป

ฉันคาดหวังรายชื่อสมาชิกที่พิมพ์ โดยแต่ละคุณสมบัติเปลี่ยนเป็นประเภท xs (เช่น int, long, string, string สำหรับด้านบน) ใช่ไหม

ขอบคุณล่วงหน้าสำหรับเบาะแสใด ๆ


person DJC    schedule 11.04.2012    source แหล่งที่มา
comment
เมื่อพิจารณาจากจำนวนข้อมูลที่ให้ไว้ที่นี่ ฉันจะแปลกใจที่คุณจะได้รับความสนใจเพียงพอ :)... การใช้ xs กับ xsd สำหรับนามแฝงเนมสเปซนั้นไม่เกี่ยวข้อง: ดูเหมือนว่าเนมสเปซจะใช้อย่างถูกต้อง หากมีคำนำหน้า xsd อยู่ด้วย ดูเหมือนไม่จำเป็นในตัวอย่างที่ให้มา ฉันขอแนะนำให้อัปเดตคำถามของคุณด้วยข้อมูลเพิ่มเติม อาจเป็นส่วนของ XML คำอธิบายเกี่ยวกับวิธีการแปลเป็นคุณสมบัติแต่ละรายการและสิ่งที่จะเป็นรายชื่อสมาชิกที่พิมพ์ - โดยทั่วไปคือโค้ดบางส่วน WSDL เพิ่มเติมจะเป็นประโยชน์ ... ฉันสงสัยว่าการรวม SOAP ของคุณคือ RPC ที่นี่ ...   -  person Petru Gardea    schedule 14.04.2012


คำตอบ (2)


จากเอกสาร ZSI:

หากการดำเนินการที่เรียกใช้ส่งคืน ComplexType จะต้องระบุข้อมูลรหัสประเภทเพื่อบอก ZSI ถึงวิธีการดีซีเรียลไลซ์การตอบสนอง

เพื่อให้ ZSI ทำการดีซีเรียลไลซ์ประเภทที่ซับซ้อนที่ส่งคืนไปยังอินสแตนซ์บุคคลอย่างโปร่งใส โมดูลที่กำหนดคลาสและรหัสประเภทจะต้องต่อท้ายรายการ ZSI.Path นอกจากนี้ยังสามารถบอก ZSI ได้อย่างชัดเจนว่าจะใช้คลาสและรหัสประเภทใดโดยการส่งคลาสเป็นพารามิเตอร์ไปยังเมธอด Binding.Receive() มักใช้วิธีแรก โดยเฉพาะอย่างยิ่งสำหรับห้องสมุดที่เผยแพร่สู่สาธารณะ

การสร้างโค้ดจาก WSDL และ XML Schema เป็นวิธีที่สองที่ ZSI มอบให้เพื่อเข้าถึงบริการ WSDL เมื่อกำหนดเส้นทางไปยังบริการ WSDL จะมีการสร้างไฟล์สองไฟล์ ได้แก่ ไฟล์ 'บริการ' และไฟล์ 'ประเภท' ซึ่งไฟล์นั้นสามารถใช้เพื่อเข้าถึงบริการได้

person jlvaquero    schedule 19.04.2012
comment
ผู้ใช้ ยังไม่มีโอกาสติดตามโค้ดนี้ แต่ความคิดเห็นของคุณดูเหมือนจะให้ความหวัง .. ขอบคุณ! - person DJC; 21.04.2012
comment
เป็นวิธีที่ดีที่สุดบนเกือบทุกกรอบ SOAP ใช้ WSDL เพื่อสร้างคลาสที่พิมพ์อย่างรัดกุม และสร้างเฟรมเวิร์กเพื่อแปลงการตอบสนอง XML ให้เป็นคลาสนั้น - person jlvaquero; 23.04.2012

เนื่องจากคุณไม่ได้ให้ข้อมูลเพียงพอสำหรับปัญหาที่เกิดขึ้นจริงในปัจจุบัน ฉันจะยึดตามพื้นฐานที่คุณเป็นมือใหม่ และจึงล้อมคำตอบของฉันไว้รอบๆ ส่วนที่ฉันพบว่าเกี่ยวข้องกับคำถามของคุณ

บริการเว็บหลักของคุณอธิบายไว้ใน WSDL http://myserver:8181/soap/SoapTest?wsdl ซึ่งเก็บการนำเข้าไปยัง WSDL หลัก WSDL หลักนี้มีคำจำกัดความของบริการซึ่งสามารถผูกมัดโดยบริการหลักของคุณได้

ดูเหมือนว่าจะมีแนวโน้ม คำขอไปยังตำแหน่งนำเข้า SoapTest?wsdl=SoapTest.wsdl ส่งคืน: ..

จากคำจำกัดความของเอกสารที่ให้ไว้ข้างต้น การนำเข้า:

<wsdl:import location="http://myserver:8181/soap/SoapTest?wsdl=SoapTest.wsdl"
          namespace="http://webservices.mycompany.com">
</wsdl:import>

แทรกไฟล์พาเรนต์ WSDL ซึ่งเก็บคำจำกัดความของสคีมาสำหรับองค์ประกอบและแอตทริบิวต์ทั้งหมดที่เกี่ยวข้องกับบริการของคุณ หมายถึงการเรียกแบบสแตนด์อโลนจะเปิดเผยคำจำกัดความเนมสเปซ xs ดูที่นี่สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสคีมาและประเภทข้อมูล

ฮะ.. เมื่อตรวจสอบแล้ว ฉันเห็นว่า xs ถูกใช้เป็นเนมสเปซ แต่ xmlns:xsd กำหนดไว้?? สิ่งนี้จะเกิดขึ้นได้อย่างไร?

ใช่ สคีมาไม่ได้ถูกกำหนดให้เป็นไฟล์แยกต่างหาก แต่เป็นส่วนหนึ่งของ WSDL มันถูกกำหนดไว้ระหว่าง <wsdl:types> แท็ก:

 <wsdl:types>
       <xs:schema xmlns:tns="http://webservices.mycompany.com" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://webservices.mycompany.com" version="1.0">
   [..]
 </wsdl:types>

ดูที่นี่ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการผูก ZSI และการสร้าง Stub

person Bitmap    schedule 20.04.2012
comment
บิตแมป ขอบคุณสำหรับการชี้แจงของคุณ ฉันจะดูเอกสาร ZSI เพิ่มเติม สำหรับฉันดูเหมือนว่ามันเป็นส่วนที่มีผลผูกพันที่ไม่ทำงาน - person DJC; 21.04.2012