java处理无法映射到SOA中一个frontendpage的错误
我目前正在SOA中开发前端解决方案,在保存域对象时遇到了麻烦
后端给了我相当大的域对象,它们也被保存为一个整体。另一侧的前端将这些数据拆分为多个页面和子页面
在分享我的实际问题之前,我想提供一些背景信息:
我们系统中的大多数任务都是自动化的,使用流程引擎、与Web服务对话和规则引擎。只有当输入数据不正确时,才需要前端,以便人们需要更正它。前端中的输入由webservices保存,当用户认为一切都正确时,他将域对象传递回流程引擎
即将出现的问题的简单示例
域对象(基本上是根实体)
- 显示在页面A上的实体1(以及根实体中的一些字段)
- B页上显示的实体2
过程识别每个实体中的错误并标记它们。给用户一个任务,前端加载域对象,显示页面a。用户更正字段,当他移动到页面B时,输入应该被保存,这样他已经完成的工作就不会丢失
问题:
负责保存域对象的Web服务将抛出ValidationException,因为实体2仍有错误。您可能想知道,错误的数据最初是如何保存的?Web服务公开了两种用于保存的服务,一种叫做“自动”,另一种叫做“手动”。操作AutomaticsSave允许使用无效数据,因为流程引擎会为返回的每个错误创建标记。manualSave当前不允许出现错误
我正在寻找解决这个问题的建议
我认为这应该是SOA中相当常见的问题。如果我错了,请纠正我:-)
一种方法是,前端中的数据只存储在会话中,用户必须先修复所有错误,然后才能继续使用,但就可用性而言,我认为这不是最好的主意
另一个想法可能是在后端进行部分验证,但这为输入错误数据打开了大门
我的最后一个想法是将流程引擎标记的错误传递给manualSave,以便Web服务知道“嘿,这个字段以前有错误,所以我不会在只有无效时抛出ValidationException”
我期待着你的想法
[更新] 在初始答案之后,我更新了域对象的结构。这个问题似乎可以扩展到“如何设计一个好的Web服务”:-)
# 1 楼答案
一些观察结果:
我建议如下:
优点:
# 2 楼答案
我很想帮你,但我需要了解更多细节
你所说的域对象是什么意思?后端无法返回任何域对象,因为如果系统正确分层,域对象将保留在域层中,并且您正在与API层/服务层通信,因此最多只能得到域对象的表示。在你看来可能是一样的,但语义完全不同
所以当你得到一个表示域对象的对象时,你会谈论实体1和实体2,但它们是什么?什么是协议(REST、SOAP)
你们能不能给我们提供webservices的方法,你们提到的是验证服务和其他保存服务,所以我只想确保我了解一切
到目前为止,根据您的输入,这是唯一的方法,但不要忘记,您总是有两个验证阶段,在前端,在域中
谢谢
更新
我的答复如下:
在Fairness中,调用web服务的web服务就是SOA
# 3 楼答案
我认为这里有几个问题。我看到的第一个问题是,在web服务上有两个不同的操作,对于您试图持久化的聚合来说,这两个操作是不同的。所谓聚合,我指的是在一个事务中保存域对象(作为一个整体)。最终,您的问题是,您没有为试图自动保存的实体强制执行不变量。自动保存和手动保存没有区别——您仍在保存。在一个操作中,你说可以忽略那些会使实体失效的属性,而在另一个操作中,你实际上是在强制执行不变量,如果你不包含这些数据,它就不是一个有效的域对象
我只能假设你这样做是为了获得域对象的部分持久性,这样你就可以适应多页步骤,你需要ID。自动保存操作会持久化部分域对象并返回一个ID,因此,您可以执行更新操作(手动保存),以确保实体正确完整地保存
我认为你最初的想法是将实体数据存储在内存中是一种更好的方法。我要补充的唯一一点是,服务持久化的聚合ID是在客户端创建的,而不是由后端系统创建的
这允许您在页面之间传递,并根据需要更新尽可能多的模型(实体1和实体2),以便持久化有效的聚合实体。每个视图模型都可以有自己的客户端验证,而不会影响其他视图模型(仍然可以使用作为备份运行的服务器端验证)
当您准备好保存域对象(作为一个整体)时,只需将视图模型(实体1和2)映射到它并保存即可。然后,您可以确定域对象已经考虑了所有不变量,并且应该保持不变,不会出现错误。鉴于您已经在客户机上创建了ID,因此不需要往返