JAXB2源代码生成
JAXB2 source generation
我有 User
个带有休眠和验证注释的实体,如下所示。
@Entity
@Table(name = "USER")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "User", propOrder = {
"id",
"login"
})
public class User {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO)
@XmlElement(required = true, type = Long.class, nillable = true)
private Long id;
@Pattern(regexp = "^[a-zA-Z0-9_-]{3,20}$",
message = "Login must contains from 3 to 20 latin characters or numbers!")
@Column(name = "LOGIN", unique = true, nullable = false)
@XmlElement(required = true)
private String login;
}
当我用实体和 getUserRequest
/ getUserResponse
编写 xsd 模式时;
maven-jaxb2-plugin
将 GetUserRequest.java
、GetUserResponse.java
和 User.java
与我的 User
class 一起生成到包中(重复 class如果我尝试编译这个 ).
<xs:complexType name="User">
<xs:sequence>
<xs:element name="id" type="xs:long" nillable="true"/>
<xs:element name="login" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="getUserRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="userId" type="xs:long"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getUserResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="user" type="tns:User"/>
</xs:sequence>
</xs:complexType>
</xs:element>
我想使用我的 User
class 而不是生成的。 (如果我删除生成的用户并启动应用程序一切正常)。
我的 spring-ws ednpoint
需要它
@Endpoint
public class UserEndpoint {
@Autowired
private UserService userService;
@ResponsePayload
@PayloadRoot(namespace = SOAP_NAMESPACE, localPart = "getUserRequest")
public GetUserResponse getUser(@RequestPayload GetUserRequest request) {
springapp.domain.User user =
userService.getUser(request.getUserId());
GetUserResponse response = new GetUserResponse();
response.setUser(toSchemaType(user));
return response;
}
private springapp.schema.User toSchemaType(springapp.domain.User user) {
springapp.schema.User schemaUser = new springapp.schema.User();
if (user.getId() != null) {
schemaUser.setId(user.getId());
}
schemaUser.setLogin(user.getLogin());
return schemaUser;
}
}
感谢 lexicore。
我创建了 domain.xjb
:
<jxb:bindings version="1.0"
xmlns:jxb="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">
<jxb:bindings schemaLocation="users.xsd">
<jxb:bindings node="//xs:complexType[@name='User']">
<jxb:class ref="springapp.domain.User"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
并添加到 maven-jaxb2-plugin
配置中:
<bindingDirectory>src/main/resources</bindingDirectory>
<bindingIncludes>
<include>domain.xjb</include>
</bindingIncludes>
它对我有用。
我实际上将 class CoversionUtils
创建为 Spring WS samples。我用了2天没找到别的方法。
您可以使用 jaxb:class/@ref
合并告诉 XJC 您已经有一个 User
class。看到这个问题:
JAXB: Prevent classes from being regenerated
但我个人只会编写您需要的两个 class 端点,并完全避免架构编译。
我有 User
个带有休眠和验证注释的实体,如下所示。
@Entity
@Table(name = "USER")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "User", propOrder = {
"id",
"login"
})
public class User {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.AUTO)
@XmlElement(required = true, type = Long.class, nillable = true)
private Long id;
@Pattern(regexp = "^[a-zA-Z0-9_-]{3,20}$",
message = "Login must contains from 3 to 20 latin characters or numbers!")
@Column(name = "LOGIN", unique = true, nullable = false)
@XmlElement(required = true)
private String login;
}
当我用实体和 getUserRequest
/ getUserResponse
编写 xsd 模式时;
maven-jaxb2-plugin
将 GetUserRequest.java
、GetUserResponse.java
和 User.java
与我的 User
class 一起生成到包中(重复 class如果我尝试编译这个 ).
<xs:complexType name="User">
<xs:sequence>
<xs:element name="id" type="xs:long" nillable="true"/>
<xs:element name="login" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:element name="getUserRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="userId" type="xs:long"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getUserResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="user" type="tns:User"/>
</xs:sequence>
</xs:complexType>
</xs:element>
我想使用我的 User
class 而不是生成的。 (如果我删除生成的用户并启动应用程序一切正常)。
我的 spring-ws ednpoint
需要它@Endpoint
public class UserEndpoint {
@Autowired
private UserService userService;
@ResponsePayload
@PayloadRoot(namespace = SOAP_NAMESPACE, localPart = "getUserRequest")
public GetUserResponse getUser(@RequestPayload GetUserRequest request) {
springapp.domain.User user =
userService.getUser(request.getUserId());
GetUserResponse response = new GetUserResponse();
response.setUser(toSchemaType(user));
return response;
}
private springapp.schema.User toSchemaType(springapp.domain.User user) {
springapp.schema.User schemaUser = new springapp.schema.User();
if (user.getId() != null) {
schemaUser.setId(user.getId());
}
schemaUser.setLogin(user.getLogin());
return schemaUser;
}
}
感谢 lexicore。
我创建了 domain.xjb
:
<jxb:bindings version="1.0"
xmlns:jxb="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">
<jxb:bindings schemaLocation="users.xsd">
<jxb:bindings node="//xs:complexType[@name='User']">
<jxb:class ref="springapp.domain.User"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
并添加到 maven-jaxb2-plugin
配置中:
<bindingDirectory>src/main/resources</bindingDirectory>
<bindingIncludes>
<include>domain.xjb</include>
</bindingIncludes>
它对我有用。
我实际上将 class CoversionUtils
创建为 Spring WS samples。我用了2天没找到别的方法。
您可以使用 jaxb:class/@ref
合并告诉 XJC 您已经有一个 User
class。看到这个问题:
JAXB: Prevent classes from being regenerated
但我个人只会编写您需要的两个 class 端点,并完全避免架构编译。