首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PropertyChangeSupport中使用JAXB?

如何在PropertyChangeSupport中使用JAXB?
EN

Stack Overflow用户
提问于 2016-01-03 06:37:33
回答 3查看 154关注 0票数 1

我试图在Eclipse项目中使用JAXB。视图小部件被绑定到用java.beans.PropertyChangeSupport建模属性。这个很好用。我还想用JAXB将模型属性绑定到磁盘上的持久XML表示。我可以将重要状态编组到XML,并可以在运行时将其解编组回pojo/bean,但不确定如何最好地继续进行。

  1. 绑定到我的视图小部件的bean setter需要firePropertyChange(),但是XJC只生成简单的setter,this.value = value。
  2. XJC属性是受保护的,所以看起来我可以将它的设置器重写为firePropertyChange(),但是我不知道我的重写子类如何在运行时神奇地改变其未封送处理的超类状态(比如当用户请求报告不同年份时,也就是我要解除编组一个不同的XML文件时)。

是否有这样做的例子或模式?当然,这并不是什么新鲜事物。非常感谢。-d

EN

回答 3

Stack Overflow用户

发布于 2016-01-04 00:55:23

@亚当谢谢!我摸索出了一个可行的解决办法:

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2016-01-04 13:49:11

在我的评论中,我提到了另一种方法来处理您的申请。

这是我们在RCP应用程序中使用的。但是,我们使用的是网络,所以我们使用JAXWS,而不仅仅是JAXB。

我对这类堆栈有一定的经验,所以这里有一个启动器给您:

代码语言:javascript
复制
/**
 * 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.
}

我不知道您的模式定义更改的频率是多少次,但是有一种模式支持这一点;

代码语言:javascript
复制
/**
 * 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注释来解决这些问题。

票数 0
EN

Stack Overflow用户

发布于 2016-01-04 23:53:53

评论不格式化,试着“回答”。需要做堆栈溢出巡回演出。还在继续

谢谢,亚当,我会把这些写在书签上,以备日后参考。它们看起来类似于我的例子,其模式是(解编组New,要安静,复制New to Old,要嘈杂)。我喜欢大脑弯曲的递归,

代码语言:javascript
复制
class UIModel<T extends UIModel>
class Car extends UIModel<Car>

并假设您已经测试过它的编译。;)

你好,-d。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34574018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档