当前位置: 首页 > 知识库问答 >
问题:

JAXB/MOXY错误的解组结果

滕胜涝
2023-03-14

我正在使用JAXB/MOXY解组包含约50个此类对象的XML文件:

@XmlRootElement(name="Message")
public class MyClass{

private String name="";


private String messageComment;


private String messageType;


private Vector<Param> params = new Vector<Param>();

private String subtype;

public UcipMessageUnmarshaller(){}

public String getName() {
    return name;
}

@XmlElement
public void setName(String name) {
    this.name = name;
}

public Vector<Param> getParams() {
    return params;
}

@XmlElementWrapper(name="params")
@XmlElement (name="param")
public void setParams(Vector<Param> params) {
    this.params = params;
}

public static Param getParam(String name, Boolean mandatory){
    return new Param(name, mandatory);
}

public void setComment(String comment) {
    this.messageComment = comment;
}


@XmlAttribute(name="comment")
public void setMessageComment(String messageComment) {
    this.messageComment = messageComment;
}

@XmlAttribute(name="type")
public void setMessageType(String messageType) {
    this.messageType = messageType;
}


@XmlAttribute(name="comment")
public String getMessageComment() {
    return messageComment;
}

public String getMessageType() {
    return messageType;
}

public String getSubtype() {
    return subtype;
}

@XmlElement
public void setSubtype(String subtype) {
    this.subtype = subtype;
}
    }
<Message>
    <name>MessageName</name>
    <params>
        <param>
            <name>Param1Name</name>
            <mandatory>true</mandatory>
        </param>
        <param>
            <name>Param2Name</name>
            <mandatory>true</mandatory>
        </param>
        <param>
            <name>Param3Name</name>
            <mandatory>true</mandatory>
        </param>
        <param>
            <name>Param4Name</name>
            <mandatory>true</mandatory>
        </param>
        <param>
            <name>Param4Name</name>
            <mandatory>false</mandatory>
        </param>
        <param>
            <name>Param5Name</name>
            <mandatory>true</mandatory>
        </param>
        <param>
            <name>Param6Name</name>
            <mandatory>false</mandatory>
        </param>
    </params>
</Message>

BR

共有1个答案

盖昀
2023-03-14

注意:我是EclipseLink JAXB(MOXy)的负责人,也是JAXB(JSR-222)专家组的成员。

@blaisedoughan这里是一个重现错误的eclipse项目的链接,在airip.java中的第72行设置一个断点,运行调试,并查看一个->Messages->ElementData[26]->Params->ElementData[15]->name以获得该错误的示例。编辑:您必须将eclipselink jar添加到您的porject链接中

基于您链接到的项目(谢谢您的提供)。如果你从图片中移除MOXy,你会看到有趣的结果:

当前,当您从文件解封时,MOXy将使用SAX解析器处理XML输入。下面我创建了一个简单的应用程序,它使用SAX解析器处理您提供的XML文档,并输出包含字符串“<”的所有字符事件的内容。

import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;

public class SAXDemo {

    public static void main(String[] args) throws Exception {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        spf.setNamespaceAware(true);
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
        xr.setContentHandler(new DefaultHandler() {

            @Override
            public void characters(char[] ch, int start, int length)
                    throws SAXException {
                String string = new String(ch, start, length);
                if(string.contains("<")) {
                    System.out.println(string);
                }
            }}
       );

       xr.parse("ressources/messages001.xml");
    }

}

输出

下面是运行演示代码的输出。大多数行对应于内容idCDATA节,因此它们是必需的,但行/param> subscrlag 不是必需的。这意味着MOXy解组错误值的原因是底层SAX解析器报告错误字符事件。

<node relation=\"XOR\"><name>adjustmentAmountRelative</name><name>mainAccountValueNew</name></node><node relation=\"AND\" comment=\"in case the request is an update of already assigned community\"><name>communityInformationCurrent</name><name>communityInformationNew</name></node>
<node relation=\"AND\"><name>promotionPlanID</name><name>promotionStartDate</name><name>promotionEndDate</name></node>
/param><param><name>subscrlag
<node relation=\"XOR\"><name>adjustmentAmountRelative</name><name>mainAccountValueNew</name></node><node relation=\"XOR\"><name>supervisionExpiryDateRelative</name><name>supervisionExpiryDate</name></node><node relation=\"XOR\"><name>serviceFeeExpiryDateRelative</name><name>serviceFeeExpiryDate</name></node>
<node relation=\"OR\"><name>msisdnCurrent</name><name>msisdnCurrentNAI</name><name>msisdnNew</name><name>msisdnNewNAI</name><name>imsiCurrent</name><name>imsiNew</name><name>naiCurrent</name><name>naiNew</name><name>sipUriCurrent</name><name>sipUriNew</name><name>privateCurrent</name><name>privateNew</name></node><node relation=\"XOR\"><name>chargingInformation</name><name>externalContract</name></node>
<node relation=\"AND\" comment=\"in case the request is an update of already assigned community\"><name>communityInformationCurrent</name><name>communityInformationNew</name></node>
<node relation=\"XOR\"><name>fafInformation</name><name>fafInformationList</name></node><node relation=\"AND\"><name>selectedOption</name><name>chargingRequestInformation</name></node>
<node relation=\"XOR\"><node relation=\"\"><name>updateAction</name><name>productID</name></node><node relation=\"\"><node relation=\"XOR\"><node relation=\"OR\"><node relation=\"XOR\"><name>startDate</name><name>startDateRelative</name><node relation=\"\" comment=\"Optional\"><name>startPamPeriodIndicator</name><name>currentTimeOffset</name></node></node><node relation=\"XOR\"><name>expiryDate</name><name>expiryDateRelative</name><name>expiryPamPeriodIndicator</name></node></node><node relation=\"OR\"><node relation=\"XOR\"><name>startDateTime</name><name>startDateTimeRelative</name></node><node relation=\"XOR\"><name>expiryDateTime</name><name>expiryDateTimeRelative</name></node></node></node><name>pamServiceID</name><name>offerType</name><name>offerProviderID</name><name>dedicatedAccountUpdateInformation</name><name>attributeUpdateInformationList</name></node></node>
<node relation=\"OR\"><name>promotionRefillAmountRelative</name><name>promotionRefillCounterStepRelative</name><name>progressionRefillAmountRelative</name><name>progressionRefillCounterStepRelative</name></node>
<node relation=\"OR\"><name>accountGroupID</name><name>serviceOfferings</name></node>
<node relation=\"OR\"><name>usageCounterUpdateInformation</name><name>usageThresholdUpdateInformation</name></node>
<?xml version="1.1" encoding="utf-8"?>

使用标准解析器API(如SAX)的好处是,您总是可以交换一个新的解析器。我运行了将Xerces2 Java Parser2.11.0版本添加到类路径的示例,该示例按预期运行。

  • http://xerces.apache.org/xerces2-j/
 类似资料:
  • 在不使用getter和setter的情况下,JAXB可以正确地解组所提供的JSON。 null和“null”是完全不同的东西,但是我不想在POJO中包含这个字段,并且我必须忽略这些null值。 编辑

  • 现在我有了这堂课: 并且我有: 如果运行此代码,将得到: 我该怎么解决这个? 我搜索了SO和Google,这些答案都不起作用: 使用Eclipselink.media-type值设置封送器属性时的PropertyException:Application/JSON JAXB javax.xml.bind.PropertyException

  • 即使在尝试了许多事情之后也无法找到解决方案,因此在此处发布希望获得一些解决此问题或修复方法。 基本上,如果 ,但是除了< code>Map之外,我还需要一个< code>@XmlElement。因此有一个字段用< code >(映射字段)@XmlPath(" .)和另一个带有< code>@XmlElement的字符串字段,然后我想执行< code >解组。 以下是我尝试 : 下面是它将被< co

  • 问题内容: 我有两节课: 我想将类B编组为xml元素,并添加类A的属性fieldOfClassB和fieldOfClassA,但在编组期间会显示以下警告消息: 请注意,这两个类来自两个不同的程序包,我无法更改此对象模型。 先感谢您! 编辑: 我正在使用外部绑定文件。 问题答案: 从您发布的日志消息中,我可以看到您正在使用MOXy的外部映射文档(请参阅http://blog.bdoughan.com

  • 编辑:感谢Preetam Kumar,这个问题已经解决,但错误现在在其他地方。当我再次尝试解组我的xml文件时,我收到这个错误,告诉我找不到元素: 然而,我给了xml文件到模式的正确路径,但是它似乎没有使用它...我不明白。 注意:我知道模式和xml标记在下面的示例中不完全匹配,我已经在我的文件中纠正了它。 最近,我不得不使用JAXB java库将一些XML文件解析为java对象。 我制作了一个X

  • 如有任何线索将不胜感激。谢谢,约翰 XML是巨大的,但这里有一个片段,序列中的媒体是空的,而它不应该是空的。