如何配置JAXB / Moxy以在XML中丢失潜在的丢失数据错误

时间:2014-11-17 11:58:31

标签: java jaxb moxy

如果提供的数据不能解组到预期的数据类型中,是否可以将JAXB配置为抛出异常?

我们有一个Integer XmlElement,有时会得到像“1.1”这样的值作为输入 - Jaxb / Moxy只是默默地忽略这些值并将它们设置为null。我们通过使用对这些值进行舍入的@XmlJavaTypeAdapter解决了已知情况,但我们不知道是否有任何其他字段在错误数据上被忽略,并且更喜欢异常以获得明确的反馈。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Wrapper
{
    @XmlNullPolicy(emptyNodeRepresentsNull = true, nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE)
    private Integer emptyNodeOnNull;

    @XmlElement
    private Integer ignoredOnNull;
}

以下测试应该引发某种异常..

@Test(expected = IllegalArgumentException.class)
public void testUnmarshallWithInvalidValue() throws Exception
{
    JAXBContext context = JAXBContext.newInstance(Wrapper.class);
    StreamSource source = new StreamSource(
            new StringReader(
                    "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><wrapper><emptyNodeOnNull>1.1</emptyNodeOnNull><ignoredOnNull>2.2</ignoredOnNull></wrapper>"));
    context.createUnmarshaller().unmarshal(source, Wrapper.class);

    fail("Should have thrown some kind of exception due to lost data.");
}

我们现在使用Moxy 2.5.2 for JAXB,因为我们需要@XmlNullPolicy(emptyNodeRepresentsNull = true,nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE)。

1 个答案:

答案 0 :(得分:2)

您可以在ValidationEventHandler上设置Unmarshaller的实例,以便在此类问题上收集失败。

public class DeserializationEventHandler implements ValidationEventHandler
{
private static final Logger LOG = LoggerFactory.getLogger(DeserializationEventHandler.class);

@Override
public boolean handleEvent(ValidationEvent event)
{
    LOG.warn("Error during XML conversion: {}", event);

    if (event.getLinkedException() instanceof NumberFormatException)
        return false;

    return true;
}

}