在创建对象时防止绑定JAXB元素

在创建对象时防止绑定JAXB元素,jaxb,Jaxb,我的课程如下: @XmlRootElement(name="User") @XmlAccessorType(XmlAccessType.NONE) public class User { private int id; private String name; public User() { } @XmlAttribute public int getID() { return id; } pub

我的课程如下:

    @XmlRootElement(name="User")
    @XmlAccessorType(XmlAccessType.NONE)
    public class User {

    private int id;
    private String name;

    public User() { }

    @XmlAttribute
    public int getID() {
      return id;
    }

    public void setID() {
      this.id = id;
    }

    @XmlElement
    public String getName() {
      return first + " " + last;
    }

    public void setName(String name) {
      this.name = name;
    }

    // other class code   
  }
我将这个类用于JAX-RS服务。当客户端希望创建新用户时,必须发送以下格式的XML表示

<User>
  <name>John Doe</name>
</User>

无名氏
在收到这样一个代码片段时,我的服务会正确地创建一个新用户。但是,如果客户端包含用户的ID属性(例如,
),则该属性的ID值将分配给用户

可以想象,我希望使用ID字段作为User类的主键,而不希望用户能够指定它。但是,当我返回用户实例的表示形式(也是XML形式)时,我希望能够将ID指定为属性


如何做到这一点?

有几种方法可以做到这一点:

选项#1

创建操作完成后,可以将ID字段设置为空

@POST
@Consumes(MediaType.APPLICATION_XML)
public void create(User user) {
    user.setId(0);
    entityManager.persist(customer);
}
选项2

或者,您可以拥有第二个不带id字段的用户类,用于创建操作的参数:

@POST
@Consumes(MediaType.APPLICATION_XML)
public void create(UserWithoutID userWithoutID) {
    User user = new User();
    // Copy from userWithoutID to user
    entityManager.persist(customer);
}
选项#3


如果您使用的是属性访问,另一个选项是只为id属性提供一个getter。然后JAXB将在写操作(封送)中包含,而不是在读操作(解封)中包含

选项#1

创建操作完成后,可以将ID字段设置为空

@POST
@Consumes(MediaType.APPLICATION_XML)
public void create(User user) {
    user.setId(0);
    entityManager.persist(customer);
}
选项2

或者,您可以拥有第二个不带id字段的用户类,用于创建操作的参数:

@POST
@Consumes(MediaType.APPLICATION_XML)
public void create(UserWithoutID userWithoutID) {
    User user = new User();
    // Copy from userWithoutID to user
    entityManager.persist(customer);
}
选项#3


如果您使用的是属性访问,另一个选项是只为id属性提供一个getter。然后JAXB将在写操作(封送)中包含,而不是在读操作(解封)中包含。

谢谢您的回复。我决定继续创建对象的新实例。但是,我决定使用同一个类,并创建了一个类似于C++中的复制构造函数的克隆方法。@ Mundar如果克隆方法看起来很繁琐和重复,你可能想试试这个:谢谢你的回复。我决定继续创建对象的新实例。但是,我决定使用同一个类,并创建一个类似于C++中的复制构造函数的克隆方法。@ Mundar,如果克隆方法看起来冗长乏味,重复性强,您可能想尝试使用这个方法: