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-pluginGetUserRequest.javaGetUserResponse.javaUser.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 端点,并完全避免架构编译。