为什么';JAXB是否要验证 我编写了一些Java类,并用JAXB注释对它们进行了注释 之后,我使用schemagen生成了一个xsd 然后,我构建一个对象图并将其编组为xml文件 我修改了xml文件,使其不再有效
我希望使用xsd,希望JAXB解组失败。但事实并非如此。为什么? JAXB正在读取一个模式(如果模式XML是错误的,JAXB会给出一个异常),但它发现JAXB在读取时忽略了该模式为什么';JAXB是否要验证 我编写了一些Java类,并用JAXB注释对它们进行了注释 之后,我使用schemagen生成了一个xsd 然后,我构建一个对象图并将其编组为xml文件 我修改了xml文件,使其不再有效,java,xml,schema,xsd,jaxb,Java,Xml,Schema,Xsd,Jaxb,我希望使用xsd,希望JAXB解组失败。但事实并非如此。为什么? JAXB正在读取一个模式(如果模式XML是错误的,JAXB会给出一个异常),但它发现JAXB在读取时忽略了该模式 SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = sf.newSchema(getClass().getResource( "/schema1.xsd
SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(getClass().getResource( "/schema1.xsd"));
JAXBContext context = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema( schema );
Customer c = JAXB.unmarshal(file, Customer.class);
编写的XML如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:customer xmlns:ns2="http://bla.com/">
JAXBEventCollector是:
class JAXBEventCollector extends ValidationEventCollector
{
@Override
public boolean handleEvent(ValidationEvent event)
{
System.out.println(event.getLocator());
return true;
}
}
你的代码应该可以工作。有几件事需要注意:
- 架构的URL是否返回为空
- 您的最后一行是输入错误“JAXB.unmarshal(file,Customer.class)”,还是JAXB是另一个未设置模式的解组器
public static void main(String[] args) throws Exception {
SchemaFactory sf = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
File xsd = new File("customer.xsd");
Schema schema = sf.newSchema(xsd);
JAXBContext context = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setSchema( schema );
FileInputStream xml = new FileInputStream("invalid.xml");
unmarshaller.unmarshal(xml);
}
对于Metro,错误如下所示:
Exception in thread "main" javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'phone-numbers'. One of '{phoneNumbers}' is expected.]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:514)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:215)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184)
at example.gettingstarted.Demo2.main(Demo2.java:23)
Exception in thread "main" javax.xml.bind.UnmarshalException
- with linked exception:
[Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.0.3.qualifier): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: An error occurred unmarshalling the document
Internal Exception: org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'phone-numbers'. One of '{phoneNumbers}' is expected.]
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:114)
at example.gettingstarted.Demo2.main(Demo2.java:23)
对于MOXy,错误如下所示:
Exception in thread "main" javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'phone-numbers'. One of '{phoneNumbers}' is expected.]
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:514)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:215)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:137)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:184)
at example.gettingstarted.Demo2.main(Demo2.java:23)
Exception in thread "main" javax.xml.bind.UnmarshalException
- with linked exception:
[Exception [EclipseLink-25004] (Eclipse Persistence Services - 2.0.3.qualifier): org.eclipse.persistence.exceptions.XMLMarshalException
Exception Description: An error occurred unmarshalling the document
Internal Exception: org.xml.sax.SAXParseException: cvc-complex-type.2.4.a: Invalid content was found starting with element 'phone-numbers'. One of '{phoneNumbers}' is expected.]
at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:114)
at example.gettingstarted.Demo2.main(Demo2.java:23)
重复:当然不是。请花点时间仔细阅读这两个问题。按照lexicore的说法,dupe-voted to Close抱歉,但我认为你们要么不编写Java程序,要么不理解这个问题。这与引用的问题完全不同,这不是一个重复的问题。您能否提供更多关于您正在使用的JAXB实现(Metro、MOXy等)和版本的详细信息。最后一行是否只是一个输入错误,您创建了一个名为unmarshaller的unmarshaller,然后执行JAXB.unmarshal?如果模式的URL错误,则会出现NullPointerException。所以这不是错误。但是你把我引向错误,我可以把头撞到墙上。谢谢你让我开心:)当然JAXB.unmarshal()没有上下文,对的是Customer c=(Customer)unmarshaler.unmarshal(file);没问题,如果有帮助,请随意投票或接受答案:)