我试图在Eclipse项目中使用JAXB。视图小部件被绑定到用java.beans.PropertyChangeSupport建模属性。这个很好用。我还想用JAXB将模型属性绑定到磁盘上的持久XML表示。我可以将重要状态编组到XML,并可以在运行时将其解编组回pojo/bean,但不确定如何最好地继续进行。
是否有这样做的例子或模式?当然,这并不是什么新鲜事物。非常感谢。-d
发布于 2016-01-04 00:55:23
@亚当谢谢!我摸索出了一个可行的解决办法:
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并使用原理图--听起来更好。我再试一试,再转一圈。这些都是非常好的技术。-d
发布于 2016-01-04 13:49:11
在我的评论中,我提到了另一种方法来处理您的申请。
这是我们在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问题,您可以通过谷歌@XmlRootElement和@XmlSeeAlso注释来解决这些问题。
发布于 2016-01-04 23:53:53
评论不格式化,试着“回答”。需要做堆栈溢出巡回演出。还在继续
谢谢,亚当,我会把这些写在书签上,以备日后参考。它们看起来类似于我的例子,其模式是(解编组New,要安静,复制New to Old,要嘈杂)。我喜欢大脑弯曲的递归,
class UIModel<T extends UIModel>
class Car extends UIModel<Car>并假设您已经测试过它的编译。;)
你好,-d。
https://stackoverflow.com/questions/34574018
复制相似问题