注释@XmlElement只写?

Nab*_*bor 4 java xml cxf jax-rs jaxb

我是java XML绑定的新手.

这是我的班级

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

在创建/注册用户期间,必须提供密码,但稍后,在要求用户信息时,XML不应包含密码元素.是否可以将Element定义为writeonly?

bdo*_*han 6

注意: 我是EclipseLink JAXB(MOXy)的负责人,也是JAXB 2(JSR-222)专家组的成员.

MOXy有一个@XmlReadOnly扩展名.注释的字段/属性@XmlReadOnly将在unmarshal(读取)期间填充,但不会在编组期间写入.

用户

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

jaxb.properites

要将MOXy指定为JAXB提供程序,您需要jaxb.properties使用以下条目添加与域模型在同一包中调用的文件:

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)

演示

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

input.xml中

<?xml version="1.0" encoding="UTF-8"?>
<user>
    <id>jdoe</id>
    <nickname>Jane</nickname>
    <email>jane.doe@example.com</email>
    <password>secret</password>
</user>
Run Code Online (Sandbox Code Playgroud)

产量

secret
<?xml version="1.0" encoding="UTF-8"?>
<user>
   <email>jane.doe@example.com</email>
   <id>jdoe</id>
   <nickname>Jane</nickname>
</user>
Run Code Online (Sandbox Code Playgroud)