JaxB解组异常:javax.xml.bind.UnmarshalException:意外元素。我哪里出错了?

JaxB解组异常:javax.xml.bind.UnmarshalException:意外元素。我哪里出错了?,java,xml,jaxb,Java,Xml,Jaxb,我有两个bean目录,一个用于请求bean,另一个用于响应bean,每个都包含自己的ObjectMapper类 我能够成功地将我的XML bean(用于请求)打包成XML字符串,然后使用下面的方法发送 JAXBElement<RequestblockType> requestblock = objectFactory.createRequestblock(requestblockType); m.marshal(requestblock, writer); /

我有两个bean目录,一个用于请求bean,另一个用于响应bean,每个都包含自己的ObjectMapper类

我能够成功地将我的XML bean(用于请求)打包成XML字符串,然后使用下面的方法发送

    JAXBElement<RequestblockType> requestblock = objectFactory.createRequestblock(requestblockType);
    m.marshal(requestblock, writer);
    // output string to console
    byte[] bytes = writer.toString().getBytes(Charset.forName("UTF-8"));
在指定的行上,我得到以下异常:

javax.xml.bind.UnmarshaleException:意外元素(uri:,local:“responseblock”)。预期的要素是

下面是我的XML和最重要的顶级bean类

<?xml version="1.0" encoding="UTF-8"?>
<responseblock version="3.67">
  <requestreference>X5727835</requestreference>
   <response type="AUTH">
  <merchant>
     <merchantname>Merchant1</merchantname>
     <orderreference>8900001233</orderreference>
     <tid>12341234</tid>
     <merchantnumber>00000000</merchantnumber>
     <merchantcountryiso2a>GB</merchantcountryiso2a>
  </merchant>
  <transactionreference>3-9-1598316</transactionreference>
  <timestamp>2014-08-18 11:56:40</timestamp>
  <acquirerresponsecode>00</acquirerresponsecode>
  <operation>
     <accounttypedescription>ECOM</accounttypedescription>
  </operation>
  <settlement>
     <settleduedate>2014-08-18</settleduedate>
     <settlestatus>0</settlestatus>
  </settlement>
  <billing>
     <amount currencycode="USD">3698</amount>
     <payment type="VISA">
        <issuer>Test Issuer1</issuer>
        <pan>1234123412341234</pan>
        <issuercountry>US</issuercountry>
     </payment>
     <dcc enabled="0" />
  </billing>
  <authcode>TEST</authcode>
  <live>0</live>
  <error>
     <message>Ok</message>
     <code>0</code>
  </error>
  <security>
     <postcode>0</postcode>
     <securitycode>2</securitycode>
     <address>0</address>
  </security>
   </response>
</responseblock>
包com.test.adapter.payment.test1.client.model.beans.responses

导入javax.xml.bind.annotation.*

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "responseblockType")
@XmlRootElement
public class ResponseblockType {

@XmlElement(required = true)
protected String requestreference;
@XmlElement(required = true)
protected ResponseType response;
@XmlAttribute(name = "version")
protected String version;

public String getRequestreference() { return requestreference; }
public void setRequestreference(String value) { this.requestreference = value; }
public ResponseType getResponse() { return response; }
public void setResponse(ResponseType value) { this.response = value; }
public String getVersion() { return version; }
public void setVersion(String value) { this.version = value;  }
}

有人能告诉我哪里出了问题吗?
如果可能的话,我可以提供更多的信息。我在另一篇文章中看到,在我的顶级bean响应类中添加@XMLRootElement可能会有所帮助,但事实并非如此。此外,在编组时,我不必按照我的要求这样做

序列化XML响应块的根元素名称与中定义的名称不同 bean类

<responseblock version="3.67">
它应该是以下内容以匹配您的注释:

 <responseblockType version="3.67">
    ...
    ...
 </responseblockType>
@XmlRootElement(name="responseblock")
public class ResponseblockType   

另一个问题是,在xml中,根元素responseblock最后没有正确关闭。同样的问题似乎也适用于在xml第4行打开的元素响应

 line 4: <response type="AUTH">
第4行:

但没有关闭

修复了xml上的结束标记。它就在那里,但出于某种原因省略了它。你是说我将ResponseBlockType定义为XMLrootElement是不正确的?不,但名称必须相等。因此,您必须将xml中根元素的名称更改为ResponseBlockType或更改bean类的名称。@Blaise Doughan。Thx用于编辑。改进了答案,非常感谢。我无法更改xml响应。因此,将默认根元素重写为@XmlRootElement(name=“responseblock”)是有效的。
@XmlRootElement(name="responseblock")
public class ResponseblockType   
 line 4: <response type="AUTH">