如果提供的数据不能解组到预期的数据类型中,是否可以将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)。
答案 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;
}
}