动态定义的webmethod参数

时间:2011-01-06 21:48:44

标签: java web-services jaxb jax-ws osgi

简短介绍。有一个生产系统,其中一些独立客户“发明”某些具有某些属性和行为的对象 - 可以为这些对象分配一些值,将它们启动到操作中并在执行时读取它们的状态。 一切都通过Web界面:客户端登录,分配值,注入对象,启动容器并看到他的对象发生变异。

一切都基于客户端的JAXB兼容架构。 Schema被编译成Java类并打包为客户端的jar。 (非常感谢stackoverflow成员,他们帮助我即时完成)。

问题在于:他们希望webservice(SOAP)通过Web界面完成目前所做的一切。当然,根据JAXB模式的wsdl类型,它们每天动态更改和部署:( 实际上,他们通过网络进行的所有操作都是:

  1. 启动/停止应用程序容器(常见任务,不是问题)
  2. 将客户定义的对象注入容器
  3. 从容器中检索特定类型的对象
  4. 一旦“2”没问题,

    “3”不是问题。但是“2”让我很生气,在我开始做某事之前我需要你的建议。就WebService而言,我的问题是:如何使用以下方法发布WS端点,假设参数类型由客户端的JAXB模式定义

    @WebMethod
    public void inject(UserDefinedObject obj) {
      getAppContainer().inject(obj); // that's all I have to implement
    }
    

    以下是我正在考虑的方法:

    1. 使用Object作为参数:public void inject(Object obj);和代码ServletFilter根据客户端架构修改xml请求/响应。但我不确定WS servlet是否会检查方法签名并在这种情况下抛出异常。另一个问题是我是否可以从该方法中访问请求的xml以执行JAXB解组。

    2. 由于我已经在编译客户端jar,我还可以编译webservice端点并动态部署它们作为OSGI包。我是OSGI的新手,这里有太多问题:它是否可能,我的耳朵,我需要将所有内容作为OSGI,如何与EJB进行通信等等。

    3. 更多谷歌搜索,但我害怕布林&页面将开始向我收费。

    4. 还有其他想法吗?

1 个答案:

答案 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剩余部分的交互中顺利运行。