2

我有一个带有单个 Long 变量的类,我希望我的输入 xml 被解组到。当我运行 unmarshal(附加单元测试)时,我在 ValidationEventHandler 中抛出以下错误

[severity=ERROR,message=For input string: "",locator=node=null,object=null,url=null,line=1,col=96,offset=-1]]
LinkedException: java.lang.NumberFormatException: For input string: ""

类和单元测试如下所示 -

@XmlRootElement
    public class Annotation {

    private Long creatorNo;

    public Long getCreatorNo() {
        return creatorNo;
    }

    public void setCreatorNo(Long creator) {
        creatorNo = creator;
    }
}

单元测试 -

public class AnnotationTest {

    @Test
    public void testUnmarshall() throws Exception {
        final String inputXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><annotation><creatorNo></creatorNo></annotation>";
        final JAXBContext jaxbContext = JAXBContext.newInstance(Annotation.class);
        final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
        unmarshaller.setEventHandler(new UnmarshallerValidationEventHandler());
        final Annotation annotationObject = (Annotation)unmarshaller.unmarshal(new StringReader(inputXML));
    }
}

从外观上看,Jaxb 不喜欢将空元素传递给 Long 类型。但是现在,如果我在“注释”类中将“creatorNo”的类型更改为整数而不是 Long,则不会引发异常,Jaxb 只会创建将“creatorNo”设置为 0 的类。那么为什么会有这种不同的行为?

我所追求的真正行为是我希望 Jaxb 将“creatorNo”视为可选并将其设置为 NULL 并为空 XML 元素。这可能吗?

谢谢

4

1 回答 1

0

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

您看到将空元素转换为 aLong的问题是 JAXB RI 问题,而不是 JAXB 问题,因为 MOXy 等其他实现可以正确处理此用例。您可以在以下位置记录针对 JAXB RI 的错误:

解决方法

  1. 使用 JAXB (JSR-222) 的另一个实现没有这个问题,这个选项是编码到标准 API 的一大好处。
  2. 如果您使用默认值,ValidationEventHandler则此转换异常将被忽略,您的文档将按预期解组。
  3. 使用 an在 a和你自己XmlAdapter之间进行转换。您可以利用 JAXB来简化此操作。StringLongDatatypeConverter
  4. 更改您的实现UnmarshallerValidationEventHandler以更容忍转换错误。

UnmarshallerValidationEventHandler

import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;

public class UnmarshallerValidationEventHandler implements ValidationEventHandler {

    @Override
    public boolean handleEvent(ValidationEvent event) {
        return event.getSeverity() < ValidationEvent.FATAL_ERROR;
    }

}
于 2012-05-04T13:34:29.567 回答