2012-04-18 76 views
4

我是新來的java XML綁定。註解@XmlElement只寫?

這是我

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

/** 
* @author Martin Burchard 
* 
*/ 
@XmlRootElement(name = "user") 
    public class User { 
    private String id; 
    private String nickname; 
    private String email; 
    private String password; 

    @XmlElement(name = "id") 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @XmlElement(name = "nickname") 
    public String getNickName() { 
     return nickname; 
    } 

    public void setNickName(String nickname) { 
     this.nickname = nickname; 
    } 

    @XmlElement(name = "email") 
    public String getEMail() { 
     return email; 
    } 

    public void setEMail(String email) { 
     this.email = email; 
    } 

    @XmlElement(name = "password") 
    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

} 

類在密碼必須給予用戶的創建/註冊,但後來要求userinformation時,該XML不應含有密碼元素。 是否可以將一個元素定義爲writeonly?

回答

5

說明:我是EclipseLink JAXB (MOXy)的領導者和JAXB 2 (JSR-222)專家組的成員。

莫西有一個@XmlReadOnly擴展。註解爲@XmlReadOnly的字段/屬性將在解組(閱讀)期間填充,但不會在元帥編寫期間填寫。

用戶

package forum10208143; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import org.eclipse.persistence.oxm.annotations.XmlReadOnly; 

/** 
* @author Martin Burchard 
* 
*/ 
@XmlRootElement(name = "user") 
public class User { 
    private String id; 
    private String nickname; 
    private String email; 
    private String password; 

    @XmlElement(name = "id") 
    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @XmlElement(name = "nickname") 
    public String getNickName() { 
     return nickname; 
    } 

    public void setNickName(String nickname) { 
     this.nickname = nickname; 
    } 

    @XmlElement(name = "email") 
    public String getEMail() { 
     return email; 
    } 

    public void setEMail(String email) { 
     this.email = email; 
    } 

    @XmlElement(name = "password") 
    @XmlReadOnly 
    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

} 

jaxb.properites

要指定莫西爲您的JAXB提供者,你需要在同一個包添加一個名爲jaxb.properties文件作爲您的域模型中的以下項:

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory 

演示

package forum10208143; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(User.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum10208143/input.xml"); 
     User user = (User) unmarshaller.unmarshal(xml); 

     System.out.println(user.getPassword()); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(user, System.out); 
    } 

} 

的input.xml

<?xml version="1.0" encoding="UTF-8"?> 
<user> 
    <id>jdoe</id> 
    <nickname>Jane</nickname> 
    <email>[email protected]</email> 
    <password>secret</password> 
</user> 

輸出

secret 
<?xml version="1.0" encoding="UTF-8"?> 
<user> 
    <email>[email protected]</email> 
    <id>jdoe</id> 
    <nickname>Jane</nickname> 
</user> 
+0

我查看了EclipseLink的網頁以及Maven倉庫,但沒有找到這些庫。你能幫我在我的Maven依賴中定義這個包嗎? – Nabor 2012-04-20 15:38:16

+1

@ user1177897 - 以下內容應該有所幫助:https://github.com/bdoughan/blog20110819/blob/master/pom.xml – 2012-04-20 15:45:04

1

據我所知沒有這樣的選擇,我建議你使用一個派生類像「ReadOnlyUser」,將不包括密碼字段。

+0

我也想過這個方向,但有希望,這是沒有必要的。謝謝 – Nabor 2012-04-18 11:55:53

1

這是我做的:

  • 我將訪問類型設置爲none,以便能夠註釋字段和屬性。
  • 然後返回* *方法註釋的密碼屬性。
  • 然後另一次吸氣,返回未加密的口令。

不知道它的所有「接受的,但到目前爲止,工程....

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

...

private String password = null; 
@XmlElement(required=false, name="password") 
public String getPassword() { 
    return (password == null || password.isEmpty()) ? null : "**********"; 
} 

@XmlTransient 
public String getUnencryptedPassword() { 
    return this.password; 
}