首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用maven-jaxb2插件生成java类

使用maven-jaxb2插件生成java类
EN

Stack Overflow用户
提问于 2013-09-06 19:19:11
回答 1查看 6.3K关注 0票数 3

我对Jaxb和maven-Jaxb 2插件非常陌生。

这是我的.xsd文件:

代码语言:javascript
复制
<xs:element name="user" type="user" />
<xs:element name="userList" type="userList" />

<xs:complexType name="user">
    <xs:all>
        <xs:element name="id" type="xs:long" minOccurs="0" />
        <xs:element name="name" type="xs:string" />
        <xs:element name="registrationDate" type="xs:dateTime" />
    </xs:all>
</xs:complexType>

<xs:complexType name="userList">
    <xs:sequence>
        <xs:element name="user" type="user" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
</xs:complexType>

这是我的.xjb文件:

代码语言:javascript
复制
<!-- Annotate @XmlRootElement Annotation for all the classes, that matches 
        in the .xsd with complexType -->
    <jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
        <jaxb:bindings node="xs:complexType['1'='1']" multiple="true"
            required="false">
            <annox:annotate>
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement"
                    name="user" />
            </annox:annotate>
        </jaxb:bindings>
    </jaxb:bindings>

当它生成时,它给出的java类有点像:

代码语言:javascript
复制
XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {

})
@Entity
@XmlRootElement(name = "${@name}")
@Table(schema = "schemaName", uniqueConstraints = {

}, name = "user_")
public class User
    implements Serializable, ToString
{

    private final static long serialVersionUID = 1L;
    protected Long id;

它应该给name = object,比如这里的"user“,我知道如果我在这样的绑定中编写,它就会

代码语言:javascript
复制
<jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema">
        <jaxb:bindings node="xs:complexType[@name='user']">
            <annox:annotate>
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="user" />
            </annox:annotate>
        </jaxb:bindings>
        <jaxb:bindings node="xs:complexType[@name='userList']">
            <annox:annotate>
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="userList" />
            </annox:annotate>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

但是我不想对用户和用户列表重复相同的代码,有任何方法可以通过注释或定义正则表达式来完成。请提出建议。

我只想知道用这段代码写什么

代码语言:javascript
复制
<annox:annotate>
    <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement"
                    name="user" />
</annox:annotate>

因此,当它创建user类时,它会显示@xmlRootElement(name='user')和其他类@xmlRootElement(name='userList')的相似之处。

EN

回答 1

Stack Overflow用户

发布于 2013-09-14 21:50:40

你应该用

代码语言:javascript
复制
<jxb:bindings node="xs:complexType" multiple="true">
  <annox:annotate>
    <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" />
  </annox:annotate>
</jxb:bindings>

也就是说,在name元素中保留未指定的annox:annotate属性。

这将在为每个复杂类型生成的类上放置一个没有属性的@XmlRootElement注释,在本例中:

代码语言:javascript
复制
@XmlRootElement
public class User {
...
}

@XmlRootElement
public class UserList {
...
}

由于@XmlRootElement的工作方式,这就是您所需要的。如果您不为name元素指定一个值,那么它在默认情况下是从类名派生的(见Oracle文档 -示例1和2),这与您的复杂类型名称相同。

换句话说,上述代码与此完全相同。

代码语言:javascript
复制
@XmlRootElement(name="user")
public class User {
...
}

@XmlRootElement(name="userList")
public class UserList {
...
}

,这正是你想要的。

另外一个注意事项-- xpath选择器node="xs:complexType['1'='1']"是不必要的--您可以只使用node="xs:complexType"来获取所有<xs:complexType>元素。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18665053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档