2015-04-18 4 views
4

Использование JAXB, я не могу понять, как маршал Properties. В частности, я пытаюсь маршалировать SimpleObjectProperty, но я полагаю, что он не будет работать и с другими свойствами. В некоторых других классов, я был в состоянии управлять геттеры/сеттеры, но это не будет работать в этом случае с HashMap из SimpleObjectPropertiesJAXB marshall Свойства

Вот мой фрагмент кода:

.. 
@XmlRootElement(name = "derby") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Derby extends Observable { 
    @XmlElement(name = "cars") 
    private final ArrayList<Car>        cars; 
    @XmlTransient 
    private final ObservableList<Car>       carsObservable; 
    @XmlElement(name = "schedule") 
    private final SimpleObjectProperty<Schedule>    scheduleProperty; 
    @XmlElement(name = "settings") 
    private final HashMap<String, SimpleObjectProperty>   settings;//This is not marshalling correctly 
.. 

А вот выход XML фрагмент:

... 
<settings> 
    <entry> 
     <key>track.lanecount</key> 
     <value/> //No value??? 
    </entry> 
    <entry> 
     <key>general.cardisplay</key> 
     <value/> 
    </entry> 
    <entry> 
     <key>track.orientation</key> 
     <value/> 
    </entry> 
    <entry> 
     <key>general.derbytitle</key> 
     <value/> 
    </entry> 
</settings> 
... 

Я создаю переменные и не оставляю их неинициализированными. Я также тестировал, действительно ли настройки имеют значение перед сортировкой, и они это делают.

Причина, по которой я использую Properties вместо реального объекта, который я пытаюсь сохранить, заключается в том, что я хочу добавить слушателей к моим настройкам, поэтому при изменении одного параметра все вещи, которые полагаются на него, будут обновляться автоматически.

+1

Большое предостережение: Я ничего не знаю о JAXB и никогда не работал с ним. Однако ... что вам нужно, это маршал * содержимого * свойства. В мире JPA это делается с помощью реализации JPA с использованием методов get/set для доступа к данным. См. [Этот блог] (http://svanimpe.be/blog/properties-jpa.html) или [этот] (https://www.marshall.edu/genomicjava/2014/05/09/one-bean- к-затруднительное-их-всех /). Может быть, есть какая-то эквивалентная идея в JAXB? –

ответ

3

я вижу, что вы используете @XmlAccessorType (XmlAccessType.FIELD), что означает, что поля класса используются для Marschal/распаковать значения ...

вы можете изменить его @XmlAccessorType (XmlAccessType.PROPERTY), а затем поместите все @XmlElement на геттер объекта.

в документации более: XmlAccessType

код ЖЕВАТЬСЯ выглядеть примерно так:

.. 
@XmlRootElement(name = "derby") 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Derby extends Observable { 

    private final ArrayList<Car>        cars; 

    private final ObservableList<Car>       carsObservable; 

    private final SimpleObjectProperty<Schedule>    scheduleProperty; 

    private final HashMap<String, SimpleObjectProperty>   settings;//This is not marshalling correctly 

    @XmlElement(name = "cars") 
    public List<Car> getCars() { 
     return cars; 
    } 

    public void setCars(final ArrayList<Car> cars) { 
     this.cars.clear(); 
     this.cars.addAll(cars); 
    } 

    @XmlElement(name = "schedule") 
    public Schedule getSchedule() { 
     return this.scheduleProperty.get(); 
    } 

    public void setSchedule(final Schedule schedule) { 
     this.scheduleProperty.set(); 
    } 

    @XmlElement(name = "settings") 
    public Map<String, Object> getSettings() { 
     // do your mapping logic here... 
     // convert your HashMap<String, SimpleObjectProperty> to Map<String, Object> 
    } 

    public void setSettings(final Map<String, Object> settings) { 
     // do your mapping logic here... 
     // convert your Map<String, Object> to HashMap<String, SimpleObjectProperty> 
    } 

    @XmlTransient 
    public ObservableList<Car> getCarsObservable() { 
     return carsObservable; 
    } 
.. 
+0

Теперь я переключился на JSON w/Jackson, но это могло решить проблему в то время. –

+0

ОК, ... но не могли бы вы принять этот ответ, это нормально для вас? Я знаю, что вы больше не используете его, но я думаю, что есть другие проблемы с той же проблемой. но это не проблема, если нет. хорошего дня. благодаря – StefanHeimberg

Смежные вопросы