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

时间:2011-04-28 20:43:52

标签: jaxb

我有一个课程如下:

    @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属性(例如<User id="100">...</User>),则将属性的id值分配给用户。

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

我如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到:

选项#1

创建操作完成后,您可以将ID字段清空。

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

选项#2

或者,您可以使用第二个没有id字段的User类,用于创建操作的参数:

@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将包括在写(marshal)中,但不包括在read(unmarshal)上。