Tôi có dịch vụ web của bên thứ ba mà tôi tạo khách hàng bằng cách sử dụng wsimport. Mỗi cuộc gọi đến webservice hoàn tất thành công, nhưng đối tượng phản hồi mà tôi nhận lại có tất cả các trường của nó được đặt thành rỗng. Giám sát mạng Tôi có thể thấy rằng trên dây tất cả các phần tử XML trong thông điệp phản hồi có các giá trị trong chúng, vì vậy đối tượng phải có dữ liệu không rỗng trong nó. Ngoài ra, một khách hàng cho cùng một dịch vụ được tạo với trục cũ1 và được gọi với cùng một dữ liệu trả về một phản hồi không trống. Bất kỳ ý tưởng gì đang xảy ra? (Trong trường hợp nó làm cho bất kỳ sự khác biệt tôi đang sử dụng thực hiện của MOXy của JAXB).Máy khách webservice jax-ws của tôi chỉ trả về các đối tượng trống
Cập nhật: Tôi đã có thể thu hẹp nó xuống. Wsdl định nghĩa đối tượng trong không gian tên riêng của nó, giả sử http://www.acme.com/ws
. Câu trả lời tôi nhận được từ các dịch vụ là
<?xml version="1.0" encoding="UTF-8"?>
... SOAP envelope ...
<ns1:opINFOWLResponse xmlns:ns1="http://www.acme.com/ws"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:responseINFOWL xsi:type="ns1:responseINFOWL">
<result>6003</result>
<ndserr/>
<transid>61437594</transid>
<descriptionerr>BLAH.</descriptionerr>
</ns1:responseINFOWL>
</ns1:opINFOWLResponse>
... SOAP closing tags ...
và là unmarshalled để một tổ chức phi rỗng OpINFOWLResponse
bao bọc xung quanh một đối tượng phi rỗng responseINFOWL
với tất cả các lĩnh vực thiết lập để null. Chỉ cần cho vui, tôi đã cố gắng viết một vài dòng để unmarshal đoạn trên (sau khi tước phí SOAP)
JAXBContext ctx = JAXBContext.newInstance(OpINFOWLResponse.class);
Unmarshaller u = ctx.createUnmarshaller();
OpINFOWLResponse o = (OpINFOWLResponse) u.unmarshal(new StringReader(theSnippetAbove));
ResponseINFOWL w = o.getResponseINFOWL();
và tôi nhận được kết quả tương tự. Nếu tôi thay đổi XML ở trên thành
<?xml version="1.0" encoding="UTF-8"?>
<ns1:opINFOWLResponse xmlns:ns1="http://www.acme.com/ws"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns1:responseINFOWL xsi:type="ns1:responseINFOWL">
<ns1:result>6003</ns1:result>
<ns1:ndserr/>
<ns1:transid>61437594</ns1:transid>
<ns1:descriptionerr>BLAH.</ns1:descriptionerr>
</ns1:responseINFOWL>
</ns1:opINFOWLResponse>
Mọi thứ đều hoạt động tốt. Rất tiếc.
Cập nhật (lần nữa): Hành vi tương tự với cả jaxb-RI và Moxy. Vẫn không có ý tưởng gì sai.
Cập nhật (ngày 09 tháng chín): Các gợi ý dưới đây về giấy chứng nhận namespace là sai là thú vị, nhưng tôi phải wsimport sẽ nhận được những điều đúng. Dù sao, đây là tôi package-info.java
@XmlSchema(
namespace = "http://www.acme.com/ws",
elementFormDefault = XmlNsForm.QUALIFIED)
package it.sky.guidaTv.service.remote;
import javax.xml.bind.annotation.XmlSchema;
import javax.xml.bind.annotation.XmlNsForm;
và đây là phần có liên quan của lớp ResponseINFOWL
/*
* <p>Java class for responseINFOWL complex type.
*
* <p>The following schema fragment specifies the expected content contained within this class.
*
* <pre>
* <complexType name="responseINFOWL">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="result" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="descriptionerr" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="transid" type="{http://www.w3.org/2001/XMLSchema}string"/>
* <element name="ndserr" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="wallet" type="{http://www.acme.com/ws}t_wallet" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* </pre>
*
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "responseINFOWL", propOrder = {
"result", "descriptionerr", "transid", "ndserr", "wallet" })
public class ResponseINFOWL {
@XmlElement(required = true)
protected String result;
@XmlElement(required = true)
protected String descriptionerr;
@XmlElement(required = true)
protected String transid;
protected String ndserr;
protected TWallet wallet;
// getters, setters and all.
}
Tôi đã thử chơi một chút với các không gian tên trong package-info
nhưng vẫn không có niềm vui.
Bạn có thể cung cấp mẫu từ tin nhắn và lớp học không? Điều này sẽ giúp xác định vị trí không khớp trong ánh xạ. –
Có lẽ tôi có thể đăng tập tin wsdl ẩn danh và lớp kiểm tra phù hợp, mọi thứ khác trong trường hợp của tôi được tạo bởi wsimport. Điều thú vị là các dịch vụ khác từ cùng một công việc của bên thứ ba tốt. – agnul