当调用一个web服务时,我得到以下异常。
javax.xml.bind.UnmarshalException: unexpected element (uri: "urn:partner.soap.sforce.com", local: "metadataServerUrl"). 预期的元素是<{}sessionId>,<{}sandbox>,<{}userId>,<{}passwordExpired>,<{}metadataServerUrl>,<{}userInfo>,<{}serverUrl>] 。
预期的响应实际上是一个名为LoginResult的对象。但是,我在异常链中看到了元素名称。
loginResult类是webservice调用的预期输出对象。请建议如何解决这个问题。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "result")
公共类 LoginResult {
@XmlElement(name = "metadataServerUrl")
protected String metadataServerUrl;
@XmlElement(name = "passwordExpired")
protected boolean passwordExpired;
@XmlElement(name = "sandbox")
protected boolean sandbox;
@XmlElement(name = "serverUrl")
protected String serverUrl;
@XmlElement(name = "sessionId")
protected String sessionId;`
@XmlElement(name = "userId")
protected String userId;
@XmlElement(name = "userInfo")
protected GetUserInfoResult userInfo;
你需要利用包级别的 @XmlSchema
注解 package-info
来指定命名空间的限定。 如果你已经有一个package-info.java文件,请确保它正在被编译。
package-info.java
以下是完整的内容。package-info.java
文件。 您需要将软件包从 example
到包含您的域名模型的包,您希望将命名空间限定应用到该包中。
@XmlSchema(
namespace = "urn:partner.soap.sforce.com",
elementFormDefault = XmlNsForm.QUALIFIED)
package example;
import javax.xml.bind.annotation.*;
更多信息
你可以在我的博客上找到更多关于JAXB和命名空间资格的信息。
正如@Blaise Doughan已经提到的,你需要确保你已经有了 package-info
文件,而且是在正确的 package
.
你确定那条线 package com.company.project
在 package-info.java
匹配您的 LoginResult
类?
同时,打印 XML
的响应,并确保该元素实际上具有以下特点 命名空间 相关的。
在我的例子中,问题是由于使用marshaller和unmrashaller的并行进程,而这两个进程是由单吨的JAXBUtil设置和获取的。