創建

2011-04-28 59 views
1

當對象我有一個類如下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

有幾種方法可以這樣做:

選項#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將包含在寫入(元帥)中,但不包括讀取(解組)。

+0

感謝您的回覆。我決定去創建一個新的對象實例。但是,我決定使用相同的類並創建一個類似於C++中的拷貝構造函數的克隆方法。 – 2011-04-28 22:30:00

+0

@Mandar如果你的克隆方法看起來乏味和重複,你可能想嘗試使用這個:http://commons.apache.org/beanutils/api/org/apache/commons/beanutils/BeanUtils.html#copyProperties%28java。 lang.Object,%20java.lang.Object 29% – MatrixFrog 2011-06-16 00:18:43