4

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

}

ユーザーの作成/登録中にパスワードを指定する必要がありますが、後でユーザー情報を要求するときに、XML に password 要素を含めないでください。要素を書き込み専用として定義することは可能ですか?

4

3 に答える 3

6

注: 私はEclipseLink JAXB (MOXy)のリーダーであり、JAXB 2 (JSR-222)エキスパート グループのメンバーです。

MOXy には@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

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

}

入力.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>

出力

secret
<?xml version="1.0" encoding="UTF-8"?>
<user>
   <email>jane.doe@example.com</email>
   <id>jdoe</id>
   <nickname>Jane</nickname>
</user>
于 2012-04-18T14:29:01.047 に答える
1

そのようなオプションがないことを私が知っている限り、パスワードフィールドを含まない「ReadOnlyUser」のような派生クラスを使用することをお勧めします。

于 2012-04-18T11:41:13.070 に答える
1

これが私がやった方法です:

  • フィールドとプロパティに注釈を付けることができるように、アクセス タイプを none に設定しました。
  • 次に、 * *を返すメソッドで password プロパティに注釈を付けました。
  • 次に、暗号化されていないパスワードを返す別のゲッター。

それがすべて受け入れられるかどうかはわかりませんが、これまでのところ機能しています....

@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; 
}
于 2012-08-13T17:53:18.967 に答える