java - 动态定义的 web 方法参数

标签 java web-services jaxb jax-ws osgi

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

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

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

  1. 启动/停止应用程序容器(常见任务,不是问题)
  2. 将客户端定义的对象注入(inject)容器
  3. 从容器中获取特定类型的对象

一旦“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,所以我还可以编译网络服务端点并将它们动态部署为 OSGI 包。我对 OSGI 完全陌生,这里有太多问题:是否可能,我的耳朵呢,我是否需要将所有内容都设置为 OSGI,如何与 EJB 通信等等。

  3. 继续谷歌搜索,但我担心 Brin 和 Page 会开始向我收费。

还有其他想法吗?

最佳答案

最终决定支持 OSGi 选项,如 correct way to turn EAR module into OSGi bundle 的解决方案中所述.一旦我的管理 war 被排除在外,变成了 OSGi 包并因此获得了对 BundleContext 的访问权限,就可以动态地动态部署/取消部署客户端的个人网络服务:

  Bundle clientWsBundle = bundleContext.installBundle(bundleId, bundleWarInputStream);
  registerNewBundle(clientWsBundle);

不确定此解决方案是否适用于其他非基于 OSGi 的应用程序服务器。我想需要一些额外的 OSGI 配置才能使其在与 EAR 的其余部分的交互中顺利工作。

关于java - 动态定义的 web 方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4620264/

相关文章:

java - 在这种情况下我应该使用继承还是接口(interface)?

java - Swing JTextArea 上的文本鼠标悬停弹出窗口?

java - Jersey Web 服务中的 PathParam 值为 null

c# - 检查 .NET 中服务器是否可访问的最佳方法?

java - 如何跟踪类中所有方法的调用?

java - 迭代多个 SortedSet 对象

java - 通过 Java 静态方法写入 log4j2 日志时包括 ThreadContext - 线程安全吗?

java - JDK 1.8 JAXB : Provider com. 未找到 sun.xml.bind.v2.ContextFactory

java - 尝试使用 JAXB 时是否可以使用很少的对象工厂?

java - 使用混合类型时编码 XML 没有子级