2013-04-02 33 views
2

我试图添加javax.persistence.Id作为对一个字段的注释并通过Maven JAXB插件生成为Java对象。然而,我碰到类没有发现javax.persistence.id异常我确保javax.persistence包含在maven依赖项中,我看到maven将它作为依赖项,但是当我通过jaxb插件运行时,它将无法工作。无法通过maven jaxb插件生成注释

  1. 这里是我的XML <xsd:complexType name="MyTable"> <xsd:sequence> <xsd:element name="id" type="xsd:int"/> </xsd:sequence> </xsd:complexType>
  2. 这里是我的binding.xjb文件
<jaxb:bindings version="2.1" 
    xmlns:jaxb="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" jaxb:extensionBindingPrefixes="annox"> 

<jaxb:bindings schemaLocation="mytable.xsd"> 

    <jaxb:bindings node="xs:complexType[@name='MyTable']/xs:sequence/xs:element[@name='id']"> 
     <annox:annotate target="field"> 
      <annox:annotate annox:class="javax.persistence.Id"/> 
     </annox:annotate> 
    </jaxb:bindings> 

</jaxb:bindings> 

  1. 这里是我的相关的pom.xml

    <dependencies> 
        <dependency> 
         <groupId>javax.xml.bind</groupId> 
         <artifactId>jaxb-api</artifactId> 
         <version>2.2.9</version> 
        </dependency> 
        <dependency> 
         <groupId>org.jvnet.jaxb2_commons</groupId> 
         <artifactId>jaxb2-basics</artifactId> 
         <version>0.6.4</version> 
        </dependency> 
        <dependency> 
         <groupId>org.jvnet.jaxb2_commons</groupId> 
         <artifactId>jaxb2-basics-annotate</artifactId> 
         <version>0.6.4</version> 
        </dependency> 
        <dependency> 
        <groupId>javax.persistence</groupId> 
        <artifactId>persistence-api</artifactId> 
        <version>1.0.2</version> 
        <scope>provided</scope> 
    </dependency> 
    </dependencies> 
    
    <build> 
        <plugins> 
         <plugin> 
          <groupId>org.jvnet.jaxb2.maven2</groupId> 
          <artifactId>maven-jaxb2-plugin</artifactId> 
          <version>0.8.3</version> 
          <executions> 
           <execution> 
            <phase>generate-sources</phase> 
            <configuration> 
             <forceRegenerate>true</forceRegenerate> 
             <schemaDirectory>myschema</schemaDirectory> 
             <bindingIncludes> 
              <include>binding.xjb</include> 
             </bindingIncludes> 
             <extension>true</extension> 
             <args> 
             <arg>-Xvalue-constructor</arg> 
             <arg>-XtoString</arg> 
             <arg>-Xequals</arg> 
             <arg>-XhashCode</arg> 
             <arg>-Xcopyable</arg> 
             <arg>-Xannotate</arg> 
            </args> 
             <plugins> 
          <plugin>       <groupId>org.jvnet.jaxb2_commons</groupId> 
    

    JAXB2-基本0.6.4

    org.jvnet.jaxb2_commons JAXB2-基本-注释0.6.4 org.jvnet.jaxb2_commons JAXB2值-构造 3.0

    </plugins> 
            </configuration> 
            <goals> 
             <goal>generate</goal> 
            </goals> 
           </execution> 
          </executions> 
         </plugin> 
        </plugins> 
        <pluginManagement> 
         <plugins> 
          <plugin> 
           <groupId>org.eclipse.m2e</groupId> 
           <artifactId>lifecycle-mapping</artifactId> 
           <version>1.0.0</version> 
           <configuration> 
            <lifecycleMappingMetadata> 
             <pluginExecutions> 
              <pluginExecution> 
               <pluginExecutionFilter> 
                <groupId>org.jvnet.jaxb2.maven2</groupId> 
                <artifactId>maven-jaxb2-plugin</artifactId> 
                <versionRange>[0.7.4,)</versionRange> 
                <goals> 
                 <goal>generate</goal> 
                </goals> 
               </pluginExecutionFilter> 
               <action> 
                <ignore></ignore> 
               </action> 
              </pluginExecution> 
             </pluginExecutions> 
            </lifecycleMappingMetadata> 
           </configuration> 
          </plugin> 
         </plugins> 
        </pluginManagement> 
    </build> 
    

但是当我运行的Maven - >生成来源我得到这个错误

Caused by: org.jvnet.annox.parser.AnnotationElementParseException: Could not parse the annotation element. 
    at org.jvnet.annox.parser.XAnnotationParser.parse(XAnnotationParser.java:90) 
    at org.jvnet.jaxb2_commons.plugin.annotate.AnnotatePlugin.annotate(AnnotatePlugin.java:387) 
    ... 31 more 
Caused by: org.jvnet.annox.annotation.AnnotationClassNotFoundException: Annotation class [javax.persistence.Id] could not be found. 
    ... 33 more 
Caused by: java.lang.ClassNotFoundException: javax.persistence.Id 

如果我只是@Id注释添加到项目中的任何Java类,那么我可以补充,我看到越来越javax.persistence.Id进口没问题。当我使用maven & binding.xjb时出了什么问题?我没有正确定义注释吗?非常感谢!

回答

10

我想这也是我有同样的问题:你添加javax.persistence作为Maven的依赖,但不能作为依赖于你的JAXB插件:

添加这样的事情(如果你使用Hibernate):

</project> 
    ... 
    <build> 
     <plugins> 
     <plugin> 
      <groupId>org.jvnet.jaxb2.maven2</groupId> 
      <artifactId>maven-jaxb2-plugin</artifactId> 
      <version>${maven-jaxb2-plugin.version}</version> 
      <executions> 
      ... 
      </executions> 
      <configuration> 
      ... 
      </configuration> 
      <dependencies> 
      <!-- Hibernate Persistence Annotations --> 
      <dependency> 
       <groupId>org.hibernate.javax.persistence</groupId> 
       <artifactId>hibernate-jpa-2.0-api</artifactId> 
       <version>${hibernate-jpa-2.0-api.version}</version> 
      </dependency> 
      </dependencies> 
     </plugin> 
     </plugins> 
    </build> 
    ... 
</project> 

我有一个类似的问题,并能解决这个问题。在下面的示例中,请注意我将注释放入XSD中,而不是放入XJB文件中,但Maven配置应该类似。

这里是我的XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1" 
    elementFormDefault="qualified" targetNamespace="http://www.gl-group.com/ewelding/schemas" 
    xmlns:ew="http://www.companyname.com/project/schemas" 
    xmlns:xmime="http://www.w3.org/2005/05/xmlmime" jaxb:extensionBindingPrefixes="annox" 
    xmlns:annox="http://annox.dev.java.net" 
    xmlns:ja="http://annox.dev.java.net/javax.xml.bind.annotation" 
    xmlns:jpa="http://annox.dev.java.net/javax.persistence" 
    xmlns:solrj="http://annox.dev.java.net/org.apache.solr.client.solrj.beans" 
    xmlns:jackson="http://annox.dev.java.net/com.fasterxml.jackson.annotation"> 

... 
<xs:element name="Certificate"> 
    <xs:annotation> 
    <xs:appinfo> 
     <annox:annotate> 
     <ja:XmlAccessorType value="NONE"/> 
     <jpa:Entity name="Certificate"/> 
     <solrj:Field value="testByOrderOf"/> 
     <jackson:JsonFormat shape="STRING" pattern="yyyy-MM-dd'T'HH:mm:ss'Z'" timezone="GMT"/> 
     </annox:annotate> 
    </xs:appinfo> 
    </xs:annotation> 
    ... 
    <xs:element ref="ew:dateOfBirth"> 
    <xs:annotation> 
     <xs:appinfo> 
     <annox:annotate target="field"> 
      <solrj:Field value="dateOfBirth"/> 
      <jackson:JsonFormat shape="STRING" pattern="yyyy-MM-dd'T'HH:mm:ss'Z'" timezone="GMT"/> 
     </annox:annotate> 
     </xs:appinfo> 
    </xs:annotation> 
    </xs:element> 
    ... 
</xs:element> 

这里是从我的pom.xml的相关章节:

... 
<properties> 
    ... 
    <maven-jaxb2-plugin.version>0.8.3</maven-jaxb2-plugin.version> 
    <jaxb2-basics.version>0.6.4</jaxb2-basics.version> 
    <jaxb2-value-constructor.version>3.0</jaxb2-value-constructor.version> 
    <solr-solrj.version>4.3.0</solr-solrj.version> 
    <jackson.version>2.2.2</jackson.version> 
    <hibernate-jpa-2.0-api.version>1.0.1.Final</hibernate-jpa-2.0-api.version> 
    ... 
</properties> 
... 
<build> 
    <plugins> 
    ... 
    <!-- Generate Java sources from XSD schema files --> 
    <plugin> 
     <groupId>org.jvnet.jaxb2.maven2</groupId> 
     <artifactId>maven-jaxb2-plugin</artifactId> 
     <version>${maven-jaxb2-plugin.version}</version> 
     <executions> 
     <execution> 
      <goals> 
      <goal>generate</goal> 
      </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <extension>true</extension> 
     <args> 
      <arg>-Xannotate</arg> 
      <arg>-Xvalue-constructor</arg> 
      <arg>-Xinheritance</arg> 
      <arg>-enableIntrospection</arg> 
     </args> 
     <!-- Include our schema --> 
     <schemaDirectory>src/main/resources</schemaDirectory> 
     <schemaIncludes> 
      <include>certificate.xsd</include> 
     </schemaIncludes> 
     <bindingIncludes> 
      <bindings>certificate.xjb</bindings> 
     </bindingIncludes> 
     <generateDirectory>src/main/java</generateDirectory> 
     <generatePackage>com.company.project.generated</generatePackage> 
     <plugins> 
      <plugin> 
      <groupId>org.jvnet.jaxb2_commons</groupId> 
      <artifactId>jaxb2-basics</artifactId> 
      <version>${jaxb2-basics.version}</version> 
      </plugin> 
      <plugin> 
      <groupId>org.jvnet.jaxb2_commons</groupId> 
      <artifactId>jaxb2-basics-annotate</artifactId> 
      <version>${jaxb2-basics.version}</version> 
      </plugin> 
      <plugin> 
      <groupId>org.jvnet.jaxb2_commons</groupId> 
      <artifactId>jaxb2-value-constructor</artifactId> 
      <version>${jaxb2-value-constructor.version}</version> 
      </plugin> 
     </plugins> 
     </configuration> 
     <dependencies> 
     <!-- SolrJ - only needed for the @Field annotation --> 
     <dependency> 
      <groupId>org.apache.solr</groupId> 
      <artifactId>solr-solrj</artifactId> 
      <version>${solr-solrj.version}</version> 
     </dependency> 

     <!-- Jackson2 Annotations --> 
     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-annotations</artifactId> 
      <version>${jackson.version}</version> 
     </dependency> 

     <!-- Hibernate Persistence Annotations --> 
     <dependency> 
      <groupId>org.hibernate.javax.persistence</groupId> 
      <artifactId>hibernate-jpa-2.0-api</artifactId> 
      <version>${hibernate-jpa-2.0-api.version}</version> 
     </dependency> 
     </dependencies> 
    </plugin> 
    ... 
    </plugins> 
</build> 

我有同样的例外,这个固定。请注意,我的示例将所有内容都放入XSD中,而不是放入XJB中,但上面提到的依赖项也可以帮助您。