繁体   English   中英

(Java)如何将经过架构验证的XML文档作为参数在分布式组件(例如Web服务或套接字)之间传递?

[英](Java) How can I pass Schema-validated XML documents as parameters between distributed components (e.g. web services or sockets)?

这是该场景的描述,对于使用的方法,我也将不胜感激。

我的应用程序的核心是一组由P2P数据库支持的Web服务。 一个服务接受一个简单的基于XML的记录(我为它设计了一个通用模式)。 该服务处理此数据(主要是基于某些条件创建密钥),并将原始数据与创建的密钥一起传递到侦听P2P节点之一中的侦听SocketServer。 该密钥数据对被路由到适当的节点,该节点将数据(与作为ID的密钥相关联)存储在XML数据库中。

第二项服务接受基于相同架构构造的查询文档,但具有用于在先前存储的文档中进行搜索和匹配的可选值。 因此,第二个服务会将此查询(带有正确的关键字)传递给P2P部分,获取结果并将其传递回服务客户端。

例如,如果提交给第一个服务的原始记录是<attr1> value1 </ attr1> <attr2> value2 </ attr2>(属性列表以及该模式要求的其他元数据),则第二个服务应该检索该记录,如果收到的查询为<attr2> value2 </ attr2>

(我稍后可以考虑使用更复杂的XPath或XQuery查询,因为底层XML数据库允许在这里而不是在此处进行值的精确匹配,但这在当前阶段并不重要。我还在研究第三项服务,但这取决于获得前两个形状正确)

所以我的问题是:

1)我应该使用哪种数据类型作为Web服务的参数? 如何将我的模式用于此用途? 为此,我正在考虑各种XML绑定框架(尤其是JAXB和SDO),但不知道如何进行。

2)如何增强这两个服务(称为存储和搜索),以使用基于原始通用模式动态创建的模板? 该服务仍将接受主要模式类型的文档,但是具有基于模板的内部属性列表,例如template1仅要求其值是int,而template2需要(浮点)和(字符串)。 当前基于JSP的原型是手动创建此模板的,但它是一个手工组装的XML文档(分散在文本中的<>标签),并且没有类型检查,所以我认为我可以做得更好!

3)是否可以生成一个快速的Web应用程序原型,以简化对该系统的访问(再次通过使用架构(&模板)来编辑适当的XML消息结构),我正在寻找的是(人类)用户选择一个模板,然后只需“填写空白”并提交,无需任何花哨的外观。

4)我可以或也可以使用此XML消息类型在套接字之间进行通信吗?

5)是否将服务部署为无状态EJB是否重要? 我是否需要它们成为EJB或servlet绰绰有余?

我目前有一个基本的实现(来自以前的开发人员),是为了满足我当前需求的一部分(我正在改进服务并添加新的派生需求),但是没有模式或验证,并且数据一直作为基本传递字符串,从而提供弱类型的输入并且难以更新手动解析。 我想将其更新为更强的绑定类型的原因是为了在数据模式中引入更改,这些更改将很容易在整个系统中传递。 基本上,我希望系统尽可能减少与所使用的数据格式/架构的耦合; 当前的原型与数据太相关了,我发现在不破坏系统的情况下更改数据极其困难。

我的最初调查使我考虑使用JAXB,但它仅支持静态类型(无法在运行时动态创建要持久保存以供以后使用的模式)。 所以我遇到了具有动态和静态类型的SDO。 问题在于,没有足够的社区和/或使用此方法的示例,因此似乎很有风险(Apache Tuscany和Eclipselink实现的示例非常稀缺,而且我找不到不超过5年的完整示例(例如http://www.ibm.com/developerworks/java/library/j-sdo/ ),还解决了SDO的XML用例(大多数似乎都集中在SDO的关系用法上)。

这是我第一次(在这里和其他地方)寻求编程帮助,请耐心等待。 我在网上搜索了很多内容,但是找不到有用的东西,但到处都是没有加成的部分。

任何评论或提示都非常感谢。

f

编辑

我忘记了一件事:搜索服务将如何取回结果? 由于它正在打开客户端套接字连接,因此无法同步获取任何结果。 当前的实现通过使服务客户端在随机端口上打开侦听套接字并将此联系信息放入查询文档中来解决此问题。 搜索Web服务将查询发送到p2p部分后,它完成。 p2p将结果作为WS调用发送到另一个服务,该服务将它们发送回服务客户端套接字。 我不太喜欢这种方法,有没有更优雅的解决方案?

我负责EclipseLink JAXB和SDO的实现,并在这些规范上代表Oracle,因此希望可以为您提供帮助。 这个问题与 9月份在JavaOne上的演讲非常相似。

1)我应该使用哪种数据类型作为Web服务的参数? 如何将我的模式用于此用途? 为此,我正在考虑各种XML绑定框架(尤其是JAXB和SDO),但不知道如何进行。

这取决于您使用的Web服务框架。 JAXB与JAX-WS一起使用更容易,尽管JAXB与JAX-RS SDO一起使用仍然更容易,但是它是一种可能的选择。

2)如何增强这两个服务(称为存储和搜索),以使用基于原始通用模式动态创建的模板? 该服务仍将接受主要模式类型的文档,但是具有基于模板的内部属性列表,例如template1仅要求其值是int,而template2需要(浮点)和(字符串)。 当前基于JSP的原型是手动创建此模板的,但它是一个手工组装的XML文档(分散在文本中的<>标签),并且没有类型检查,所以我认为我可以做得更好!

我不是100%这里的意思,但是以下内容可能会有所帮助:

3)是否可以生成一个快速的Web应用程序原型,以简化对该系统的访问(再次通过使用架构(&模板)来编辑适当的XML消息结构),我正在寻找的是(人类)用户选择一个模板,然后只需“填写空白”并提交,无需任何花哨的外观。

JAX-RS是用于创建快速原型的很好的框架。 以下是我创建的示例:

4)我可以或也可以使用此XML消息类型在套接字之间进行通信吗?

我更喜欢通过HTTP协议进行通信的框架(如JAX-RS)。

5)是否将服务部署为无状态EJB是否重要? 我是否需要它们成为EJB或servlet绰绰有余?

我的偏好是为该服务使用EJB会话bean。 如果要与数据库进行交互,则可以利用Java Transaction API(JTA)来管理数据库事务。

SDO

EclipseLink是SDO 2.1.1(JSR-235)参考实现。 我们在下面发布了一些示例。 如果您正在寻找如何做一些特定的事情,我将尝试发布一个相关的例子。

杰克斯

JAXB是静态的。 它也比SDO更受欢迎。 在EclipseLink中认识到这一点,我们实现了动态JAXB功能。 它通过JAXB倾斜为您提供SDO的动态方面。

编辑#1

由于您正在处理JAX-WS,并且您的模型几乎完全是动态的,因此我认为您应该完全跳过JAXB绑定。 在下面的链接中,请参阅“关闭数据绑定”部分

这将使我们将消息的主体作为javax.xml.transform.Source对象。 我们将需要基于动态模板处理XML。 SDO将是一个不错的选择。 您可以不断使用XML模式将新类型添加到HelperContext。

helperContext.getXSDHelper().define(schema1, null);
helperContext.getXSDHelper().define(schema2, null);

您将可以从Web服务取消封送Source,如下所示:

XMLDocument doc = helperContext.getXMLHelper().load(source, null, null);
DataObject rootDataObject = doc.getRootObject();
String someValue = rootDataObject.getString("attr3/childAttr/anotherChildAttr");

调用另一个服务时,您还可以使用XMLHelper将对象编组为XML。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM