【问题标题】:java jaxb unexpected element unmarshallingjava jaxb意外元素解组
【发布时间】:2018-08-27 14:59:16
【问题描述】:

为什么在使用 JAXB 时必须使用ObjectFactory.java

我的工作场景是这样的:

我正在做一个从 .NET 到 Java 的转换项目。在 .NET 中,类已经与 POJO 类似。我刚刚在代码中添加了注释(如@XmlRoot@XmlElememnt 等)。我解决了注释相关的错误。

现在我收到这样的错误:

意外元素(uri:"urn:Adapter-v3", local:"Settings")。预期元素是 、

XML文件如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xml>
<Settings version="3" xmlns="urn:Adapter-v3">
  <Connections>      
    <Connection name ="A" description="DEV">
      <SaveVersion version="M" siteURL="https://example.com" />
      <Save>
        <Id>id123</Id>
        <Client>hello</Client>
      </Save>   
    </Connection>    
    <Connection name ="B" description="DEV1">
      <SaveVersion version="M" siteURL="https://example.com" />    
      <Auth>
        <UserId>id123</UserId>
        <Password>pass</Password>
      </Auth>
    </Connection>
    </Connections>
  <Mappings>
    <Mapping cont="AA" auction="A1">
      <Description>Desc</Description>
      <Content    
        attr1="IO"
        attr2="d"
        attr3="Information"
        attr4="false"

        <Element enabled="false" count="200" prefix="DocLib_" itemPrefix="0" />
        <Sub enabled="false" count="100" prefix="Folder_" itemPrefix="0" />
        <FilenameA auction="N" delay="3" />
      </Content>
     </Mapping>
  <Mapping cont="AB" auction="SharePointOLDev1">
      <Description>Desc</Description>
      <Content    
        attr1="IO"
        attr2="d"
        attr3="Information"
        attr4="false"

        <Element enabled="false" count="200" prefix="DocLib_" itemPrefix="0" />
        <Sub enabled="false" count="100" prefix="1" itemPrefix="0" />     
      </Content>
     </Mapping>
  </Mappings>
  <TypeMappings>
    <TypeMapping Type="rfid" ext="msg" />
  </TypeMappings>

</Settings>

POJO 类:

public class Settings {
    @XmlElement(name="Connections", nillable=false, type=Connection.class)
    public ArrayList<Connection> Connections;

    @XmlElement(name="Mappings", nillable=false, type=Mapping.class)
    public Mapping[] Mappings;

    protected ArrayList<TypeMapping> TypeMappings;

    public Mapping[] getMappings() {
        return Mappings;
    }

    public void setMappings(ContentServerMapping[] contentServerMappings) {
        Mappings = Mappings;
    }

    @XmlElement(name="TypeMappings")
    public ArrayList<MIMETypeMapping> getTypeMappings() {
        return TypeMappings;
    }

    public void setTypeMappings(ArrayList<TypeMapping> TypeMappings) {
        TypeMappings = TypeMappings;
    }

}

【问题讨论】:

  • 顺便说一句,您的 POJO 的设置器中有一个错误:Mapping = Mapping; 将无效。你需要写this.Mapping = Mapping;

标签: java jaxb


【解决方案1】:

您缺少命名空间。要么将 namespace = "urn:Adapter-v3" 添加到所有 @XmlElements 和 co。到处。或者干脆声明整个包的默认命名空间:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "urn:Adapter-v3",
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.acme.foo;

(在package-info.java.)

【讨论】:

  • 有效..:) 谢谢。错误已解决,但我的变量 COnnections、Mappings 和 TypeMappings 为空,尽管给出了 this.Mappings = Mappings。
  • @user9450093 这是一个不同的问题。
  • 你能否给我一个关于指定命名空间重要性的见解?
  • @user9450093 如果您的 XML 有命名空间,那么您的 JAXB 类也应该有它。
  • @user9450093 不是和是。不,您不必使用生成的ObjectFactory 创建对象。是的,在某些情况下,JAXB 需要ObjectFactory(例如替换组)。
猜你喜欢
  • 2019-05-15
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多