Bạn có thể tận dụng số ValidationEventHandler
để nhận hành vi bạn đang tìm kiếm. Một yếu tố không mong muốn được coi là cảnh báo bị bỏ qua theo mặc định. Để hỗ trợ trường hợp sử dụng của bạn, bạn có thể cung cấp ValdidationEventHandler
không thành công trên cảnh báo (xem bên dưới).
Demo
package forum10721257;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Dog.class);
File xml = new File("src/forum10721257/input.xml");
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setEventHandler(new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent event) {
return false;
}
});
Dog dog = (Dog) unmarshaller.unmarshal(xml);
}
}
JAXB RI Exception
Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"id"). Expected elements are <{}name>
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:243)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:238)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.childElement(Loader.java:90)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.StructureLoader.childElement(StructureLoader.java:236)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:483)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:465)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:135)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:376)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2715)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:202)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:174)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189)
at forum10721257.Demo.main(Demo.java:26)
EclipseLink JAXB (MOXY)
Chúng tôi vừa mới bổ sung hành vi này để MOXY. Bạn sẽ cần phải sử dụng EclipseLink 2.4.0 hoặc 2.3.3. Một xây dựng hàng đêm có thể thu được từ các vị trí sau:
CẬP NHẬT
tôi cần phải tinh chỉnh các lớp Dog
từ câu hỏi của bạn. Dưới đây là những gì tôi đã sử dụng.
Chó
package forum10721257;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="Dog")
public class Dog {
private String name;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
}
Nguồn
2012-05-23 17:39:14
Tôi không biết nếu bạn có thể đạt được điều đó bằng jaxb. Tuy nhiên, đây là hành vi mặc định của XStream. – tibtof
Mục đích kiểm tra đơn vị của nó nhiều hơn. Tôi có lẽ sẽ chỉ phải sử dụng XmlUnit, unmarshal XML và sau đó remarshal nó và so sánh đó là những gì tôi đã làm trong quá khứ. –