java - 使用 JavaFX 的 MVC,无需客户端-服务器架构

标签 java mongodb javafx

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

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

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

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

对此有什么想法吗?

一些可视化:

UML

最佳答案

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

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

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

由于重复是可能的,但微不足道,我只会描述如何直接使用模型,还有另外两种解决方案:

1.1 只需手动绑定(bind)你的属性(更简单但并不更优雅) 在绑定(bind)只读时动态创建 Observable SimpleStringProperty ...,或使用 Helpers 在屏幕可观察上添加监听器,以便在值可修改时调用常规 setter

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

下面是 javaFX Bean 与 jackson 的示例代码:

@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);
    }
}

您正在使用吗啡,您必须检查这是否可行。

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

关于java - 使用 JavaFX 的 MVC,无需客户端-服务器架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49529033/

相关文章:

java - 将 ArrayList 从 Fragment 类传递到 Activity

mongodb - Pymongo 批量插入不起作用

node.js - 使用 jasmine-node 在 nodejs 中测试异步 mongodb 调用

java - 有没有办法在javafx中显示从meshview到平面绘图的uv?

java - 错误: incompatible types: void cannot be converted to NumPal

java - 我在 ListView 中有一个自定义单元格。如何使其在触摸时突出显示?

java.security.AccessControlException :access denied ("java.io.FilePermission" "File path" "write" )

java - 创建名称为 'mongoTransactionManager'的bean时出错:在设置bean属性 'mongoDatastore'时无法解析对bean 'datastore'的引用

user-interface - 如何在 javafx 中的 FlowPane 周围制作简单的实心边框

JavaFX 计算器应用程序设置操作事件