Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JAXB @XmlTransient не работает


Автор: Gladkiy 10.3.2011, 12:42
Доброго времени суток.

Использую для создания репрезентации java классов в XML стандартный фрейморк JAXB. При аннотировании приватного поля с помощью @XmlTransient содержимое поля все равно мапится в выходной XML.
Например:
Абстрактный класс А
Код

public abstract class A {

    public abstract String getName();

    public abstract void setName(String name);

    public abstract int getAge();

    public abstract void setAge(int age);
}

его наследуют классы В
Код

public class B extends A {

    private String name = "name = B";
    private int age = 10;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getAge() {
        return age;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void setAge(int age) {
        this.age = age;
    }
}


и С, в котором есть отмеченное с помощью @XmlTransient поле.
Код

public class C extends A {

    private String name = "name = C";
    @XmlTransient
    private int age = 50;

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getAge() {
        return age;
    }

    @Override
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void setName(String name) {
        this.name = name;
    }
}


В классе D создаются экземпляры:
Код

@XmlRootElement
public class D {

    public B propertyB;
    private C propertyC;

    public D() {
        propertyB = new B();
        propertyC = new C();
    }

    public C getPropertyC() {
        return propertyC;
    }

    public void setPropertyC(C propertyC) {
        this.propertyC = propertyC;
    }
}

Main class
Код

public class Main {
    public static void main(String[] args) throws JAXBException {
        D instOfD = new D();
        JAXBContext jc = JAXBContext.newInstance(D.class);
        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(instOfD, new File("example.xml"));
    }

}


В итоговом XML все равно присутствуют данные отмеченные как @XmlTransient

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
-<d>-<propertyB><age>10</age><name>name = B</name></propertyB>-<propertyC><age>50</age><name>name = C</name></propertyC></d>

 smile  smile  smile 
Что было попробовано:
1. В классе С и D изменялся тип доступа к данным с помощью @XmlAccessorType(XmlAccessType.FIELD). Были добавлены еще лишние поля.
2. Отмечались getter/setter  в нужном классе как @XmlTransient. Привело к ошибке аннотаций.
3. В классе D поле propertyC изменялось на private и создавались getter/setter.

Может кто знает как с этим бороться? Я буду премного благодарен. smile 

Автор: MisterCleric 10.3.2011, 12:46
Привет.
Поставь такое на коренном классе:
Код

@XmlAccessorType(XmlAccessType.FIELD)


Добавлено через 50 секунд
в смысле в твоей иерархии, а не классе D, хотя там тоже не помешает

Автор: Gladkiy 10.3.2011, 16:00
Помогло.  smile 
Добавил @XmlAccessorType(XmlAccessType.FIELD) в абстрактный класс А.
Раннее при добалении в класс D такого эффекта не было.

Спасибо тебе добрый человек. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)