JAXB抱怨当应该存在的命名空间存在



我有一组单元测试,可以将存储的XML文件列入JAXB对象。他们在工作。这些测试是使用PowerMock(1.6.6),因为剪切中有一个细节(测试的代码)需要" newnew"条款。

我决定更改对象工厂后面的抽象,这使我可以移至纯Mockito。

当我这样做时,在测试期间将XML文件分解为JAXB对象时,我开始遇到莫名其妙的问题。它根本没有将某些元素存储到JAXB对象中。

进行Unmarshalling的方法看起来像:

protected JAXBElement<?> unmarshallToObject(Node node, Class<?> nodeClassType) throws ServiceException {
    try {
        return getUnmarshaller().unmarshal(node, nodeClassType);
    } catch (JAXBException ex) {
        baseLogger.error(null, ex, "JAXB Exception while un-marshalling");
        throw new ServiceException(UslErrCodes.BACKEND_APP.createServiceErr(BackendConfig.USL.getId(),
                "JAXB Exception while un-marshalling"), ex);
    }
}

我将其更改为以下内容以获取更多信息:

protected JAXBElement<?> unmarshallToObject(Node node, Class<?> nodeClassType) throws ServiceException {
    try {
        Unmarshaller unmarshaller = getUnmarshaller();
        unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());
        return unmarshaller.unmarshal(node, nodeClassType);
    } catch (JAXBException ex) {
        baseLogger.error(null, ex, "JAXB Exception while un-marshalling");
        throw new ServiceException(UslErrCodes.BACKEND_APP.createServiceErr(BackendConfig.USL.getId(),
                "JAXB Exception while un-marshalling"), ex);
    }
}

我发现的是删除过程拒绝在JAXB实例中存储一些元素,因为它遇到了XML模式错误。

例如,更改此代码后,我看到了如下的消息。我在这里参考命名空间" http://namespace1.xsd",显然不是原始名称,但是这些示例中显示了特定命名空间的所有位置,我使用此" namespace1.xsd" name。

JAXB Exception while un-marshalling:unexpected element (uri:"http://namespace1.xsd", local:"securityFeeRequired"). Expected elements are <{}securityFeeRequired>,<{}proprietarySegmentFlag>,<{}Treatment>,<{}creditScoreMessage>,<{}ServiceEligibility>,<{}warningMessage>,<{}creditScoreResult>,<{}creditBand>

您可以看到,XML文档指出该元素在名称空间中,但是" {}"似乎暗示没有任何名称空间。

这是生成的Jaxb类的摘录:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "creditScoreResult", "creditScoreMessage", "warningMessage",
        "securityFeeRequired", "treatment", "creditBand", "proprietarySegmentFlag", "serviceEligibility" })
public static class FooResult implements Serializable {
    private static final long serialVersionUID = 1L;
    protected String creditScoreResult;
    protected String creditScoreMessage;
    protected String warningMessage;
    protected boolean securityFeeRequired;

这是来自同一软件包中生成的"软件包info"的@xmlschema注释:

@XmlSchema(namespace="http://namespace1.xsd", elementFormDefault=XmlNsForm.QUALIFIED)

所以,在遇到此错误后,我决定尝试进行"这不可能起作用"。

我更改了XML文件,以便这是类似的摘录:

    <ExecuteFooResponse xmlns:ns1="http://namespace1.xsd" xmlns:ns2="http://namespace2.xsd">
        <FooResult>
            <securityFeeRequired>false</securityFeeRequired>
            <Treatment><code>A001</code>
                <message>No additional fee is required at this time</message>
            </Treatment>
            <ServiceEligibility>
                <productCode>BAR</productCode>
                <serviceEligibilityIndicator>true</serviceEligibilityIndicator>
            </ServiceEligibility>
        </FooResult>
        <Response>
            <ns2:code>0</ns2:code>
            <ns2:description>Success</ns2:description>
        </Response>
    </ExecuteFooResponse>

我做出的唯一更改是" namespace1.xsd"的命名空间前缀。据我所知,它是"(空白)失败的,这是正确的。我将其更改为" NS1",但仅在声明中。我显然不是在元素正文中引用该前缀。这使得通过。

请恢复我的理智。

问题最终是XML文献测试所使用的实际上不是架构 - valid。他们存在导致验证失败的微妙问题,但是其他开发人员故意将这些问题放在那里,因为他们发现没有这些错误就不会通过。我仍在试图弄清楚为什么PowerMock仅适用于该状态中的文件,但是我的文档现在是模式 - 磁带,并且莫科托测试正常。

相关内容

  • 没有找到相关文章

最新更新