![](/img/trans.png)
[英]Java classes are not generated from wsdl file using maven-jaxb2-plugin
[英]Generating java classes using maven-jaxb2-plugin
我对Jaxb和这个maven-jaxb2插件很陌生
这是我的.xsd文件:
<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文件:
<!-- 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类提供了一些类似于:
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 name的地方,例如这里的“ user”,我知道如果我在这样的绑定中写,它将产生
<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>
但是我不想为用户和用户列表重复相同的代码,有什么办法可以通过注释或定义正则表达式来实现。 请提出一些建议。
我只是想知道用这段代码写什么
<annox:annotate>
<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement"
name="user" />
</annox:annotate>
因此,当创建用户类时,它会显示@xmlRootElement(name ='user')和其他类@xmlRootElement(name ='userList')的相似性。
你应该用
<jxb:bindings node="xs:complexType" multiple="true">
<annox:annotate>
<annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" />
</annox:annotate>
</jxb:bindings>
也就是说 ,在annox:annotate
元素中保留未指定的name
属性。
在这种情况下,这会为每个复杂类型生成的类上放置一个@XmlRootElement
批注,该批注不带任何属性。
@XmlRootElement
public class User {
...
}
@XmlRootElement
public class UserList {
...
}
由于@XmlRootElement
工作方式,这就是您所需要的。 如果未为name元素指定值,则默认情况下它是从类名称派生的( 请参见Oracle文档 -示例1和2),该值与您的复杂类型名称相同。
换句话说,上面的代码与此完全相同。
@XmlRootElement(name="user")
public class User {
...
}
@XmlRootElement(name="userList")
public class UserList {
...
}
正是您想要的。
只是需要注意一点-xpath选择器node="xs:complexType['1'='1']"
是不必要的-您可以使用node="xs:complexType"
来获取所有<xs:complexType>
元素。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.