【问题标题】:JAXB unmarshalling exception: unexpected element when spring webservice 1.0.4JAXB 解组异常:spring webservice 1.0.4 时出现意外元素
【发布时间】:2023-04-02 00:29:02
【问题描述】:

我已经编写了 spring webservice cleint 示例 这在 springws1.5 上运行良好,但是当使用 spring ws 1.0.4 运行时,我遇到了异常。请帮助我为什么我们会得到这个异常以及如何解决。我只需要使用 down 版本,因为我的 spring 版本是 2.0.4。请尽可能尽快回复。

Unhandled exception: 
    org.springframework.oxm.jaxb.JaxbUnmarshallingFailureException: JAXB unmarshalling exception: unexpected element (uri:"http://yyy.org", local:"xxxResponse"). Expected elements are <{}xxx>,<{}xxxResponse>; nested exception is javax.xml.bind.UnmarshalException: unexpected element (uri:"yyy.org", local:"xxxResponse"). Expected elements are <{}xxx>,<{}xxxResponse>
    Caused by: 
    javax.xml.bind.UnmarshalException: unexpected element (uri:"http://yyy.org", local:"xxxResponse"). Expected elements are <{}xxx>,<{}xxxResponse>
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:603)
     at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:244)
     at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:239)
     at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116)
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1009)
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:446)
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:427)
     at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:71)
     at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137)
     at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:240)
     at com.sun.xml.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:123)
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:314)
     at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:297)
     at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:107)
     at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:395)
     at org.springframework.ws.support.MarshallingUtils.unmarshal(MarshallingUtils.java:62)
     at org.springframework.ws.client.core.WebServiceTemplate$2.extractData(WebServiceTemplate.java:276)
     at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:417)
     at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:265)
     at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:253)
     at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:245)
     at encompass.mtm.webservices.Code1ServiceClient.getAddressCheckResponse(Code1ServiceClient.java:24)

我使用以下示例进行了编码 http://justcompiled.blogspot.com/2010/11/web-service-client-with-spring-ws.html 我做了以下更改: 使用来自 jboss bin 的 wsconsume 批处理文件生成类, 我保留了罐子

saaj1.3.jar, spring-ws-core-1.0.4.jar,spring-xml-1.0.4.jar
spring-oxm-tiger-1.0.4.jar,spring-oxm-1.0.4.jar 

jboss/../lib

以下是在我的spring配置文件中:

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
        <property name="messageFactory">
            <bean class="com.sun.xml.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl"/>
        </property>
    </bean>

    <bean id="test1ObjectFactory" class="test.webservices.ObjectFactory"/>
    <bean id="test1ServiceMarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="contextPath" value="test.webservices" />
    </bean>
    <bean id="test1ServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
        <constructor-arg ref="messageFactory" />
        <property name="marshaller" ref="test1ServiceMarshaller"></property>
        <property name="unmarshaller" ref="test1ServiceMarshaller"></property>
        <property name="messageSender">
            <bean
                class="org.springframework.ws.transport.http.CommonsHttpMessageSender">
            </bean>
        </property>
        <property name="defaultUri" value="${webservice.url}" />
    </bean>
    <bean id="test1ServiceClient" class="test.webservices.test1ServiceClient">
        <constructor-arg ref="test1ServiceTemplate"></constructor-arg>
        <property name="test1ObjectFactory" ref="test1ObjectFactory"></property>
    </bean>

现在我已经替换了所有东西并放置了webservice 1.5.0 jar。我仍然面临这个问题,以前它有效。我没有做太多的改变。我的代码有什么问题吗?如何检查..如何跟踪。非常感谢任何帮助。 我的 ObjectFactory 很简单:

@XmlRegistry
public class ObjectFactory {

    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: test.webservices
     * 
     */
    public ObjectFactory() {
    }

    /**
     * Create an instance of {@link xxxResponse }
     * 
     */
    public XxxResponse createxxxResponse() {
        return new xxxResponse();
    }

    /**
     * Create an instance of {@link xxx }
     * 
     */
    public Xxx createXXX() {
        return new XXX();
    }

}

输入 以下是类级别的注释

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "xxxData"
})
@XmlRootElement(name = "Xxx")

回复:

  @ XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "xxxResult"
    })
    @XmlRootElement(name = "XxxResponse")

【问题讨论】:

  • 收到此错误时请给我回复。在哪里看?
  • 请建议我如何保存日志以及如何解决这些错误?
  • 没人接听??需要更多信息或者这个问题不清楚。请帮帮我,我真的在找这个。
  • 我在我的问题中添加了配置文件,请帮帮我。我工作了几天,遇到所有类型的错误,请帮帮我。
  • 我没有 jaxb.properties。我没有在我的结构中保留 package-info.java。是必需的吗?我已经发布了 ObjectFactory.java。 AddrCheck 屏蔽了 xxx。谢谢你的时间

标签: spring spring-ws jaxb2


【解决方案1】:

您得到的异常是告诉您 JAXB 上下文期望接收没有 XML 名称空间的元素。这是预期的,因为您的 JAXB 注释类没有在任何地方定义命名空间。您希望在绑定类(或package-info.java)中的某个位置找到它声明为@XmlNamespace,但您在任何地方都没有。

然而,Spring-WS 正在接收 具有命名空间(在您的示例中为 http://yyy.org)的响应,因此解组失败。

我无法解释的是它如何与 Spring-WS 1.5.x 一起工作 - 每个版本的命名空间不匹配都应该失败。

您用来生成 JAXB 类的任何工具应该已经生成了一个声明命名空间的 package-info.java 文件。你确定它不在那里吗?

【讨论】:

  • 谢谢先生。这真的是我的坏事。我不知道这个 package-info.java 有那么重要。我没有保留这个文件,以为它只包含包名。现在我保留了,每件事都正常工作。通过搜索谷歌,我试图在 XmlRootElement 中保留 AddrCheck 和 AddrCheckResponse 文件的命名空间。但那一次我得到了空结果。无论如何,非常感谢您,先生。这就是为什么我又保留了一个问题来了解这些编组器是如何工作的,无论如何,再次非常感谢您,先生。
  • 我遇到了完全相同的问题,但我从未删除过 package-info.java 文件并仔细检查过它是否真的存在。请给我一些提示好吗?
  • 我已将 package-info.java 保留在适当的位置,但仍然出现意外元素错误。知道我还缺少什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2019-05-15
  • 2018-08-27
相关资源
最近更新 更多