Скройте стоимость в xml, который может быть восстановлен только, не выстраивая

Действительно ли возможно скрыть стоимость в XML, таким образом, что это может быть восстановлено только, не выстраивая.

1
nl ja de

4 ответы

Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.

Ниже некоторые возможности для осуществления этого варианта использования, если вы используете MOXy в качестве своего поставщика JAXB. Чтобы использовать MOXy в качестве вашего поставщика JAXB, необходимо включать названный файл jaxb.properties в том же самом пакете как модель предметной области со следующим входом:

ВЫБОР № 1 - XmlAdapter

XmlAdapter мог привыкнуть к пустому указателю значение свойства во время операции маршала. В то время как XmlAdapter является стандартным классом JAXB, возвращая пустой указатель из маршал , метод заставляет исключение происходить, когда справочное внедрение JAXB используется.

StringAdapter

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class StringAdapter extends XmlAdapter {

    @Override
    public String marshal(String string) throws Exception {
        return null;
    }

    @Override
    public String unmarshal(String string) throws Exception {
        return string;
    }

}

Person

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement(name="Person")
public class Person {

    String password;

    @XmlJavaTypeAdapter(StringAdapter.class)
    public String getPassword() {
        return password;
    }

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

}

OPTION #2 - Setter With No Getter

Когда MOXy используется в качестве поставщика JAXB, если у вас будет собственность с аннотируемым сеттером и никаким получателем тогда, то MOXy будет рассматривать его как собственность только для чтения.

import javax.xml.bind.annotation.*;

@XmlRootElement(name="Person")
public class Person {

    String password;

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

}

ВЫБОР № 3 - MOXy's @XmlReadOnly Расширение

MOXy's @XmlReadOnly расширение может также использоваться, чтобы отметить собственность, как прочитано только.

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

@XmlRootElement(name="Person")
public class Person {

    String password;

    @XmlReadOnly
    public String getPassword() {
        return password;
    }

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

}

ДЕМОНСТРАЦИОННЫЙ КОДЕКС

input.xml


     some password 

*Demo*

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14231799/input.xml");
        Person person = (Person) unmarshaller.unmarshal(xml);

        System.out.println(person.password);

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

}

Output

 some password 
<?xml version="1.0" encoding="UTF-8"?>

2
добавлено

Note: I'm the EclipseLink JAXB (MOXy) lead and a member of the JAXB (JSR-222) expert group.

Ниже некоторые возможности для осуществления этого варианта использования, если вы используете MOXy в качестве своего поставщика JAXB. Чтобы использовать MOXy в качестве вашего поставщика JAXB, необходимо включать названный файл jaxb.properties в том же самом пакете как модель предметной области со следующим входом:

ВЫБОР № 1 - XmlAdapter

XmlAdapter мог привыкнуть к пустому указателю значение свойства во время операции маршала. В то время как XmlAdapter является стандартным классом JAXB, возвращая пустой указатель из маршал , метод заставляет исключение происходить, когда справочное внедрение JAXB используется.

StringAdapter

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class StringAdapter extends XmlAdapter {

    @Override
    public String marshal(String string) throws Exception {
        return null;
    }

    @Override
    public String unmarshal(String string) throws Exception {
        return string;
    }

}

Person

import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlRootElement(name="Person")
public class Person {

    String password;

    @XmlJavaTypeAdapter(StringAdapter.class)
    public String getPassword() {
        return password;
    }

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

}

OPTION #2 - Setter With No Getter

Когда MOXy используется в качестве поставщика JAXB, если у вас будет собственность с аннотируемым сеттером и никаким получателем тогда, то MOXy будет рассматривать его как собственность только для чтения.

import javax.xml.bind.annotation.*;

@XmlRootElement(name="Person")
public class Person {

    String password;

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

}

ВЫБОР № 3 - MOXy's @XmlReadOnly Расширение

MOXy's @XmlReadOnly расширение может также использоваться, чтобы отметить собственность, как прочитано только.

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

@XmlRootElement(name="Person")
public class Person {

    String password;

    @XmlReadOnly
    public String getPassword() {
        return password;
    }

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

}

ДЕМОНСТРАЦИОННЫЙ КОДЕКС

input.xml


     some password 

*Demo*

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14231799/input.xml");
        Person person = (Person) unmarshaller.unmarshal(xml);

        System.out.println(person.password);

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

}

Output

 some password 
<?xml version="1.0" encoding="UTF-8"?>

2
добавлено

Следующий подход мог использоваться с любым JAXB (JSR-222) внедрение.

Демонстрационный пример

Marshaller. Слушатель мог привыкнуть к пустому указателю стоимость, прежде чем объект будет собран, и затем восстановите его впоследствии.

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14231799/input.xml");
        Person person = (Person) unmarshaller.unmarshal(xml);

        System.out.println(person.password);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setListener(new Marshaller.Listener() {

            private String password;

            @Override
            public void afterMarshal(Object object) {
                if(object instanceof Person) {
                    Person person = (Person) object;
                    person.setPassword(password);
                    password = null;
                }
            }

            @Override
            public void beforeMarshal(Object object) {
                if(object instanceof Person) {
                    Person person = (Person) object;
                    password = person.getPassword();
                    person.setPassword(null);
                }
            }
        });
        marshaller.marshal(person, System.out);

        System.out.println(person.password);
    }

}

input.xml


     some password 

Продукция

 some password 
<?xml version="1.0" encoding="UTF-8"?>

 some password 
1
добавлено

Следующий подход мог использоваться с любым JAXB (JSR-222) внедрение.

Демонстрационный пример

Marshaller. Слушатель мог привыкнуть к пустому указателю стоимость, прежде чем объект будет собран, и затем восстановите его впоследствии.

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

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum14231799/input.xml");
        Person person = (Person) unmarshaller.unmarshal(xml);

        System.out.println(person.password);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setListener(new Marshaller.Listener() {

            private String password;

            @Override
            public void afterMarshal(Object object) {
                if(object instanceof Person) {
                    Person person = (Person) object;
                    person.setPassword(password);
                    password = null;
                }
            }

            @Override
            public void beforeMarshal(Object object) {
                if(object instanceof Person) {
                    Person person = (Person) object;
                    password = person.getPassword();
                    person.setPassword(null);
                }
            }
        });
        marshaller.marshal(person, System.out);

        System.out.println(person.password);
    }

}

input.xml


     some password 

Продукция

 some password 
<?xml version="1.0" encoding="UTF-8"?>

 some password 
1
добавлено