简短介绍。有一个生产系统,其中一些独立客户“发明”某些具有某些属性和行为的对象 - 可以为这些对象分配一些值,将它们启动到操作中并在执行时读取它们的状态。 一切都通过Web界面:客户端登录,分配值,注入对象,启动容器并看到他的对象发生变异。
一切都基于客户端的JAXB兼容架构。 Schema被编译成Java类并打包为客户端的jar。 (非常感谢stackoverflow成员,他们帮助我即时完成)。
问题在于:他们希望webservice(SOAP)通过Web界面完成目前所做的一切。当然,根据JAXB模式的wsdl类型,它们每天动态更改和部署:( 实际上,他们通过网络进行的所有操作都是:
“3”不是问题。但是“2”让我很生气,在我开始做某事之前我需要你的建议。就WebService而言,我的问题是:如何使用以下方法发布WS端点,假设参数类型由客户端的JAXB模式定义:
@WebMethod
public void inject(UserDefinedObject obj) {
getAppContainer().inject(obj); // that's all I have to implement
}
以下是我正在考虑的方法:
使用Object作为参数:public void inject(Object obj);
和代码ServletFilter
根据客户端架构修改xml请求/响应。但我不确定WS servlet是否会检查方法签名并在这种情况下抛出异常。另一个问题是我是否可以从该方法中访问请求的xml以执行JAXB解组。
由于我已经在编译客户端jar,我还可以编译webservice端点并动态部署它们作为OSGI包。我是OSGI的新手,这里有太多问题:它是否可能,我的耳朵,我需要将所有内容作为OSGI,如何与EJB进行通信等等。
更多谷歌搜索,但我害怕布林&页面将开始向我收费。
还有其他想法吗?
答案 0 :(得分:0)
最后决定支持OSGi选项,如correct way to turn EAR module into OSGi bundle的解决方案中所述。一旦我的管理员战争被拉出来,变成了OSGi包,因此获得了对BundleContext的访问权限,就可以动态地动态部署/取消部署客户端的个人网络服务:
Bundle clientWsBundle = bundleContext.installBundle(bundleId, bundleWarInputStream);
registerNewBundle(clientWsBundle);
不确定此解决方案是否适用于其他基于非OSGi的应用服务器。我想一些额外的OSGI配置需要在与EAR剩余部分的交互中顺利运行。