【问题标题】:MVC with JavaFX without client-server-architecture带有 JavaFX 的 MVC,没有客户端-服务器架构
【发布时间】:2018-03-28 07:57:50
【问题描述】:

我有一个非常笼统的问题。 对于我的工作,我必须使用 MongoDB、Java 和 JavaFX(以及 yWorks)实现一个演示应用程序。因此,由于我 - 不幸的是 - 必须独自工作,而且我们公司没有大量的专业知识,所以我所做的只是为自己学习和学习这些技术。

由于我们不希望有服务器应用程序,因此只有 MongoDB 作为服务和客户端处理数据。 (这没关系,因为它只是一个演示器)。但我有点困惑。

实现 pojo 类以存储和从数据库加载并实现具有完全相同属性但使用 JavaFX 的“SimpleStringProperty”的 gui 模型类导致 - 在我看来 - 奇怪的事实,即我有两个语义相同的模型类我必须实现某种 Observer/Observable-Pattern 以将更改从 ViewModel 传播到 POJOS,反之亦然。

一定有更优雅的方式来做到这一点,对吧?

对此有何想法?

一些可视化:

【问题讨论】:

    标签: java mongodb javafx


    【解决方案1】:

    分析 只是分析,如果您不想要详细信息,请跳至命题

    复制或不复制类模型定义的问题是一种架构选择,但是这两个解决方案是可能的并且可以接受的:

    1. 在控制器和屏幕中使用您的模型 bean
    2. 使用辅助方法 from/to 复制所有类以进行转换。

    由于可以复制但微不足道,我只描述如何直接使用模型,还有另外2种解决方案:

    1.1 只需手动绑定你的属性(越简单但不是越优雅) 以只读方式绑定时动态创建 Observable SimpleStringProperty ...,或者使用 Helpers 在屏幕上添加监听器 observable 以在值可修改时调用常规设置器

    1.2。让你的数据框架使用getter/setter而不是字段:在大多数情况下你可以配置它(这是hibernate的情况)所以如果mongodb可以使用方法而不是字段来序列化/反序列化对象,这将是可能的

    我在这里假设您使用标准 javaFX bean,每个属性都有 3 个访问器:get、set、property。

    主张 很抱歉这个大介绍,这是一个使用 Jackson 的建议解决方案。 首先显然可以将 mongodb 与 Jackson 一起使用:Efficient POJO mapping to/from Java Mongo DBObject using Jackson

    那么这里是一个带有jackson的javaFX Bean的示例代码:

    @JsonAutoDetect(fieldVisibility = Visibility.NONE, getterVisibility = Visibility.PUBLIC_ONLY, setterVisibility = Visibility.PUBLIC_ONLY)
    public class MyBean {
    
        private final StringProperty label = new SimpleStringProperty();
    
        public final StringProperty labelProperty() {
            return this.label;
        }
    
        public final String getLabel() {
            return this.labelProperty().get();
        }
    
        public final void setLabel(final String label) {
            this.labelProperty().set(label);
        }
    }
    

    你正在使用morphia,你必须检查这是否可能。

    旁注: 我在下面的链接上问了一个关于对象不重复的类似问题(我在 3 层而不是 2 层,但仍然存在重复问题),例如通常的解决方案仍然是重复: https://softwareengineering.stackexchange.com/questions/367768/how-to-avoid-dto-on-a-client-server-application?noredirect=1#comment804724_367768

    【讨论】:

    • 嗯,问题正是你所说的:MongoDB 没有使用任何东西,因为这是低级查询编程。我忘了告诉你我正在使用 morphia 来注释类属性并读取/写入 mongodb。所以正如你所说,Morphia 将 StringProperties 视为一个复杂的对象,我还没有找到一种方法来自定义这个序列化/反序列化过程。我想我可以选择通过侦听器和 Observable-Pattern 手动将 POJO 属性和 javaFX-Properties 绑定在一起......
    • 好的,看来 mondodb 可以与高度可调的 jackson 一起使用 :stackoverflow.com/questions/15789471/…,我会用这个更新我的答案
    • @SimonBauer 似乎 morphia 使用 getter/setter,你应该使用我的提议的 bean,没有杰克逊注释,这样我就可以修复我的答案。
    • 感谢您的回答。我确实尝试过这个 afaik,也许只是“SimpleListProperty”确实破坏了我的代码。由于这些返回 ObservableLists 的 getter 和 setter 是不可序列化的。如我错了请纠正我。 (我确实花了两天时间将我的代码重构为您在图片中看到的内容)
    • @SimonBauer 是的,如果在您的情况下可能的话,getter 不应该返回属性。很高兴它有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多