2014-07-01 33 views
27

我需要驗證類對象針對我的架構,其中我已經提供的正則表達式對自動生成的JAXB類驗證字段的註釋@XmlRootElement。當我嘗試驗證我的類的對象,我得到以下錯誤:不能編組類型作爲元素,因爲它缺少用於自動生成的類

不能編組型「XYZ」爲元素,因爲它缺少一個@XmlRootElement註釋

這裏是我使用驗證碼我的自動生成的類對象:

jc = JAXBContext.newInstance(obj.getClass()); 
source = new JAXBSource(jc, obj); 
Schema schema = schemaInjector.getSchema(); 
Validator validator = schema.newValidator(); 
validator.validate(source); 

有沒有其他解決方法?

回答

45

如果你的類沒有一個@XmlRootElement註解,那麼你可以在JAXBElement實例包裹。如果您從XML Schema生成類,那麼生成的ObjectFactory可能爲您提供了一種方便的方法。

我已經寫了更多關於這種使用情況在我的博客:

+0

感謝您的幫助。我已經根據您的博客上的解決方案修改了我的代碼,但我仍然收到相同的錯誤。修改後的代碼是:'的QName QNAME =新QName( 「http://www.w3.org/2001/XMLSchema」,obj.toString());''的JAXBElement E = createJAXBElement(QNAME,obj.getClass(), OBJ);''JC = JAXBContext.newInstance(e.getValue()的getClass());''的Marshaller米= jc.createMarshaller();''源=新JAXBSource(JC,m.getClass());' '架構模式= schemaInjector.getSchema();'' 驗證驗證= schema.newValidator();''validator.validate(源);'_Please advice_ – user656213

+0

我發現此答案有幫助:http://stackoverflow.com/a/2172942/58363它給@ Blaise-doughan的答案提供了替代措辭。 –

2

我建議你使用Maven插件「Maven的插件,JAXB2」從XSD生成的類。 使用綁定文件*。 xjb添加批註@XmlRootElement。

下面一些例子

e.g綁定文件

<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:annox="http://annox.dev.java.net"> 

    <globalBindings> 
     <xjc:serializable uid="12343" /> 
     <xjc:simple/> 
    </globalBindings> 

</bindings> 

e.g Maven插件 http://confluence.highsource.org/display/MJIIP/User+Guide

<plugin> 
     <groupId>org.jvnet.jaxb2.maven2</groupId> 
     <artifactId>maven-jaxb2-plugin</artifactId> 
     <version>0.8.1</version> 
     <executions> 
      <execution> 
       <phase>generate-sources</phase> 
       <goals> 
        <goal>generate</goal> 
       </goals> 
      </execution> 
     </executions> 
     <configuration> 
      <args> 
       <arg>-Xannotate</arg> 
       <arg>-nv</arg> 
      </args> 
      <extension>true</extension> 
      <forceRegenerate>true</forceRegenerate> 
      <bindingDirectory>${basedir}/src/main/resources/schema/xjb</bindingDirectory> 
      <bindingIncludes> 
       <include>*.xjb</include> 
      </bindingIncludes> 
      <schemas> 
       <schema> 
        <fileset> 
         <directory>${basedir}/src/main/resources/schema/</directory> 
         <includes> 
          <include>*.xsd</include> 
         </includes> 
        </fileset> 
       </schema> 
      </schemas> 
      <debug>true</debug> 
      <verbose>true</verbose> 
      <plugins> 
       <plugin> 
        <groupId>org.jvnet.jaxb2_commons</groupId> 
        <artifactId>jaxb2-basics</artifactId> 
        <version>0.6.2</version> 
       </plugin> 
       <plugin> 
        <groupId>org.jvnet.jaxb2_commons</groupId> 
        <artifactId>jaxb2-basics-annotate</artifactId> 
        <version>0.6.2</version> 
       </plugin> 
       <plugin> 
        <groupId>org.jvnet.jaxb2_commons</groupId> 
        <artifactId>jaxb2-namespace-prefix</artifactId> 
        <version>1.1</version> 
       </plugin> 
      </plugins> 
     </configuration> 
    </plugin> 
+0

注意''這裏的有關部分,這將增加了'@ XmlRootElement'註解。這是JAXB RI中的供應商定製,請參閱https://jaxb.java.net/nonav/2.2.1/docs/vendorCustomizations.html。它不僅僅是添加這個註釋。如果您只需要'@ XmlRootElement',則可以使用jaxb2-basics-annotate擴展。 –

相關問題