jaxb验证事件定位器 - 验证错误的行和列号

时间:2011-01-04 12:31:39

标签: validation jaxb

在进行JAXB编组时,我收集验证错误,并且还希望获取发生错误的行号和列号。对于所有错误,我一直得到columnNumber = -1和lineNumber = -1。有什么我忘了的吗?

代码示例:

Marshaller marshaler = jaxbCtx.createMarshaller();
marshaler.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
ValidationErrorCollector errorCollector = new ValidationErrorCollector();
marshaler.setEventHandler(errorCollector);
marshaler.setSchema(getSchema());
marshaler.setProperty("com.sun.xml.bind.namespacePrefixMapper", new MyNamespacePrefixMapper());
JAXBElement<RootObject> jaxbElement = new JAXBElement<RootObject>(ROOT_QNAME, RootObject.class, (RootObject) rootObject);
marshaler.marshal(jaxbElement, new StringWriter());

for (ValidationEvent validationEvent : errorCollector.getValidationEvents()) {
validationEvent.getLocator().getColumnNumber(); // returns -1
validationEvent.getLocator().getLineNumber(); // returns -1
...

public class ValidationErrorCollector implements ValidationEventHandler {

    /** List of validation events (with validation errors). */
    private List<ValidationEvent> validationEvents = new ArrayList<ValidationEvent>();

    @Override
    public boolean handleEvent(ValidationEvent validationEvent) {
        // record the validation error
        validationEvents.add(validationEvent);
        // let validation continue
        return true;
    }

2 个答案:

答案 0 :(得分:2)

这是预期的行为。当你编组时,错误的来源来自被编组​​的对象。通过事件也可以找到该对象。

有关详细信息,请参阅:

答案 1 :(得分:1)

您希望检索哪个列和行号(在哪个文件中)? 我认为这是设计上的。行号和列号用于ValidationEvent,它在解组时发生。在这种情况下,您可以在XML文件中获取问题的位置以进行解组。

但在您的情况下,您正在尝试编组一个对象 - 因此没有XML文件,因此您没有获得列或行号。