为什么';JAXB是否要验证 我编写了一些Java类,并用JAXB注释对它们进行了注释 之后,我使用schemagen生成了一个xsd 然后,我构建一个对象图并将其编组为xml文件 我修改了xml文件,使其不再有效

为什么';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

我希望使用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"));
 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是另一个未设置模式的解组器
下面是一段代码,在解压无效XML时肯定会抛出错误。这段代码可以正确地用于和Metro(RI)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);没问题,如果有帮助,请随意投票或接受答案:)