在进行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;
}
答案 0 :(得分:2)
这是预期的行为。当你编组时,错误的来源来自被编组的对象。通过事件也可以找到该对象。
有关详细信息,请参阅:
答案 1 :(得分:1)
您希望检索哪个列和行号(在哪个文件中)? 我认为这是设计上的。行号和列号用于ValidationEvent,它在解组时发生。在这种情况下,您可以在XML文件中获取问题的位置以进行解组。
但在您的情况下,您正在尝试编组一个对象 - 因此没有XML文件,因此您没有获得列或行号。