【问题标题】:Unrecognized field using com.fasterxml.jackson.databind使用 com.fasterxml.jackson.databind 无法识别的字段
【发布时间】:2021-03-16 09:15:24
【问题描述】:

我有一个具有这种结构的 xsd 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema xmlns="someurl" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="someurl" 
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Accesso">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Identificativo" type="idAccesso"/>
            <xs:element ref="Erogatore"/>
            <xs:element ref="Entrata"/>
            <xs:element name="ModalitaArrivo" type="modalitaArrivo"/>
            <xs:element ref="CentraleOperativa" minOccurs="0"/>
            <xs:element name="ResponsabileInvio" type="responsabileInvio"/>
            <xs:element name="IstitutoProvenienza" type="istitutoProvenienza" minOccurs="0"/>
            <xs:element name="ProblemaPrincipale" type="problemaPrincipale"/>
            <xs:element name="Trauma" type="trauma" minOccurs="0"/>
            <xs:element name="Triage" type="triageAccesso"/>
            <xs:element ref="Assistito"/>
            <xs:element ref="Importo" minOccurs="0"/>
            <xs:element name="TipoTrasmissione" type="tipoTrasmissione"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:element name="Assistito">
    ... xml code ...
</xs:element>
<xs:element name="CentraleOperativa">
    ... xml code ...
</xs:element>
<xs:element name="flsProSoc">
    <xs:complexType mixed="true">
        <xs:choice>
            <xs:element ref="Accesso" minOccurs="0" maxOccurs="unbounded"/>
        </xs:choice>
    </xs:complexType>
</xs:element>

... others ref fields ...
</xs:schema>

所以,我已经用 jaxb2 生成了 java 类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
   "content"
})
@XmlRootElement(name = "flsProSoc")
public class FlsProSoc {

    @XmlElementRef(name = "Accesso", namespace = "someurl", type = Accesso.class, required = false)
    @XmlMixed
    protected List<Object> content;


    public List<Object> getContent() {
        if (content == null) {
            content = new ArrayList<Object>();
        }
        return this.content;
    }
}

Accesso 类和其他类的东西相同。这是我试图反序列化的 xml 文件的示例:

<?xml version="1.0"?>
<flsProSoc xmlns="url" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <Accesso>
     <Identificativo></Identificativo>
     <Erogatore>... xml fields ...</Erogatore>
     <Entrata>... xml fields ...</Entrata>
     <ModalitaArrivo></ModalitaArrivo>
     <CentraleOperativa>... xml fields ...</CentraleOperativa>
     <ResponsabileInvio></ResponsabileInvio>
     <ProblemaPrincipale></ProblemaPrincipale>
     <Triage></Triage>
     <Assistito>... xml fields ...</Assistito>
     <Importo>... xml fields ...</Importo>
     <TipoTrasmissione>I</TipoTrasmissione>
 </Accesso>

 <Accesso> ... </Accesso>
 <Accesso> ... </Accesso>
 <Accesso> ... </Accesso>
 <Accesso> ... </Accesso>

但是当我要反序列化一些 xml 文件时,我得到了这个错误:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“Accesso”(com.xx.yy.FlsProSoc 类),未标记为可忽略(一个已知属性:“content”]) 在 [来源:(文件); line: 4, column: 21] (通过引用链: com.xx.yy.FlsProSoc["Accesso"])

我在 gradle 中使用这个依赖项

compile 'com.fasterxml.jackson.core:jackson-core:2.11.0'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.11.0'
compile 'com.fasterxml.jackson.core:jackson-databind:2.11.0'
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.11.0'
compile 'org.codehaus.woodstox:woodstox-core-asl:4.4.1'

我试过用:

(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

并且没有例外,但我也没有从我的 xml 中获得任何数据。 有人可以帮忙解决问题吗?

【问题讨论】:

  • 如果您不知道Accesso 的确切结构,是否应该将其注释为@XmlAnyElement,就像这里描述的stackoverflow.com/questions/4278546/… 一样
  • 您的 xml 架构是否与您尝试反序列化的 xml 匹配?您可以在线查看此内容freeformatter.com/xml-validator-xsd.html 或通过 Notepad++。我认为存在名称空间问题。在 xml 中指定 xmlns="url",而在 xsd(缺少根标记 flsProSoc)中指定 xmlns="someurl"。您还在生成的代码中看到的 someurl。
  • @martijn 不,网址相同,我只是在这里省略了。 xsd 和 xml 中的 xmlns="flussi.mds.it/flsProSoc"

标签: java xml jackson xsd


【解决方案1】:

解决方案是使用

@JsonProperty("Accesso")

就在 FlsProSoc 类中的 getContent() 方法之前。

【讨论】:

    猜你喜欢
    • 2014-06-21
    • 1970-01-01
    • 2016-04-13
    • 2016-01-26
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多