我有一个课程如下:
@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指定为属性。
我如何实现这一目标?
答案 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)上。