我有一个非常普遍的问题。 对于我的工作,我必须使用 MongoDB、Java 和 JavaFX(以及 yWorks)实现演示应用程序。因此,不幸的是,由于我必须独自完成这项工作,而且我们公司没有大量的专业知识,所以我所做的就是自己研究和学习这些技术。
由于我们不想拥有服务器应用程序,因此只有 MongoDB 作为服务和处理数据的客户端。 (这没关系,因为它只是一个演示器)。但我有点困惑。
实现 pojo 类来存储和从数据库加载,并实现具有完全相同属性但使用 JavaFX 的“SimpleStringProperty”的 gui 模型类导致了 - 在我看来 - 奇怪的事实,我有两个语义相同的模型类我必须实现某种观察者/可观察模式以将更改从 ViewModel 传播到 POJOS,反之亦然。
一定有更优雅的方法来做到这一点,对吗?
对此有什么想法吗?
一些可视化:
最佳答案
分析 只是分析,如果不需要详细信息,请跳至命题
重复或不重复类模型定义的问题是一个架构选择,但这两种解决方案是可能且可接受的:
- 在 Controller 和屏幕中使用模型 bean
- 使用辅助方法 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/