2016-01-03 24 views
1

我想在Eclipse項目中使用JAXB。視圖窗口小部件通過java.beans.PropertyChangeSupport綁定到模型屬性。這工作正常。我還想使用JAXB將模型屬性綁定到磁盤上的持久XML表示。我可以將重要狀態編組爲XML,並且可以在運行時將它重新編組爲pojo/bean,但我不確定如何繼續。如何通過PropertyChangeSupport使用JAXB?

  1. 綁定到我的視圖窗口小部件的設置器豆需要的firePropertyChange(),但XJC僅生成簡單的setter,THIS.VALUE =值。因爲它看起來像我可以覆蓋它的setter firePropertyChange(),但我不知道我的重寫的子類可以有它的解組超類在運行時神奇地改變狀態(如用戶請求報告時爲不同的一年,這是我將解組一個不同的XML文件)。

有沒有這樣做的例子或模式?這當然不是新的。非常感謝。 -d

+0

您可以嘗試反過來使用XJC:用必要的註釋聲明您的Java類並從它們生成XML模式。這樣你可以實現UI綁定所需的setter。假設你將它綁定到一個UI,你將只使用一組屬性/元素,並且當模式的顯示部分改變時你需要編寫代碼。新的XML元素不會打擾JAXB解組;他們將被忽略。 –

回答

0

@亞當謝謝!我grokked這個可行的解決方案:

public class MyBean extends JaxBean { 
    public JaxBean getJaxBean() { 
    return this; 
    } 
    public void setJaxBean(JaxBean jaxBean) { 
    super.setThis(jaxBean.getThis()); 
    super.setThat(jaxBean.getThat()); 
    // etc... 
    } 
    public MyBean() { 
    // etc... 
    } 
} 

我覺得我的困惑想解組的豆會不知何故神奇地取代我的工作實例。上面的解決方案需要額外的文本,但它的工作原理和使用JaxBean的啞設置程序避免了在加載新XML時不必要地觸發事件。

您的解決方案使用JAXB註釋MyBean並使用schemagen聽起來更好。我會嘗試下一步。這些都是非常好的技術。 -d

0

我在我的評論中提到了另一種應用程序。

這是我們在我們的RCP應用程序中使用的。除了我們通過網絡進行編組/解組之外,我們使用JAXWS而不僅僅是JAXB。

我用這種堆棧的有些經驗,所以這裏有一個腳踏啓動器爲您提供:

/** 
* Your UI POJO-s should extend this class. 
*/ 
public abstract class UIModel<T extends UIModel> { 
    protected final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport(this); 

    /** 
    * This comes handy at times 
    */ 
    public void afterUnmarshal(Unmarshaller unmarshaller, Object parent) { 
     //.... 
    } 

    /** 
    * And this too, trust me. 
    */ 
    public void deepCopy(final T of) { 
      removePropertyChangeListener(propertyChangeListener); 

      //It's from Spring Framework but you can write your own. Spring is a fat-ass payload for a Java-SE application. 
      BeanUtils.copyProperties(of, this, IGNORED_ON_CLIENT); 

      addPropertyChangeListener(propertyChangeListener); 
     } 
    } 

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { 
     propertyChangeSupport.addPropertyChangeListener(propertyName, listener); 
    } 

    public void removePropertyChangeListener(PropertyChangeListener listener) { 
     propertyChangeSupport.removePropertyChangeListener(listener); 
    } 
} 

/** 
* Example of a UI POJO. 
*/ 
public class Car extends UIModel<Car> { 
    private String make; 
    private int numberOfWheels; 
    //... etc. 

    /** 
    * Example of a setter 
    */ 
    public void setMake(String make) { 
     propertyChangeSupport.firePropertyChange("make", this.make, this.make = make); 
    } 

    public String getMake() { 
     return make; 
    } 
    //... etc. 
} 

我不知道多久你的模式定義的變化,但有支持此模式;

/** 
* New application (compiled with the class below) can open a file saved by the old application. 
*/ 
public class Car2 extends Car { 
    private String fuelType; // Example of a new field 

    public void setFuelType(String fuelType) { 
     propertyChangeSupport.firePropertyChange("fuelType", this.fuelType, this.fuelType = fuelType); 
    } 

    //... etc. 
} 

這樣老應用程序可以打開新的XML輸出。從此類的源代碼中刪除字段將導致RuntimeException,因爲JAXB仍在尋找它。 如果你的客戶總是最新的,那麼你根本就不應該在意這一點。

當處理Java集合並過分地繼承時,您將遇到JAXB問題,您可以使用Googling @XmlRootElement和@XmlSeeAlso註釋來解決這些問題。

0

評論不格式化,嘗試「回答」。需要做stackoverflow遊覽。繼續,


謝謝,亞當,我將這些書籤以供將來參考。他們看起來和我的例子很相似,模式是(unmarshal New,保持安靜,複製新的舊的,嘈雜的)。我喜歡思維彎曲遞歸,

class UIModel<T extends UIModel> 
class Car extends UIModel<Car> 

並假設您已經測試過編譯。 ;)

問候,-d。