RESTEasy – 动态添加资源类

使用RESTEasy,我实现了Application的子类,以提供单例资源列表。 有没有办法在以后动态添加另一个单身? 我没有找到一种方法从API文档中做到这一点。

我自己没有尝试过,但我发现了一篇博客文章,其中描述了这一点: http : //sarbarian.wordpress.com/2010/03/07/resteasy-and-osgi-perfect-match/

在部署期间,RESTEasy将其注册表放在servlet上下文中。 博客中提出的想法是,您从servlet上下文中获取注册表,然后添加您的资源类。

像这样的东西:

import org.jboss.resteasy.spi.Registry; Object resource = new MyService(); Registry registry = (Registry) context.getAttribute(Registry.class.getName()); registry.addSingletonResource(resource); 

我自己试过这个,尽管它很神经兮兮,但效果很好。 我们有一个基础设施,我们的主应用程序导入并加载了几个独立项目(插件),我们希望在现有的RestEasy API(和Swagger文档)中包含对它们的访问。

我们最初将类加载硬编码到我们的主要Rest Application类中,该类需要在我们的API中始终显示所有插件。 为了避免这种情况并重新确定这些项目的独立性(在任何给定时间都可以包含所有项目,一些项目或者没有项目),我们创建了返回特征/目标类本身的动态方法,该方法在引导阶段加载RestEasy框架。 它就像一个魅力。

在我们的Rest Application类中,我们按如下方式实现:

 @Override public Set> getClasses() { Set> classes = new HashSet<>(); classes.add(mainAPIStuff.class); classes.add(plugin1.class); classes.add(plugin2.class); classes.add(plugin3.class); . . . return classes; } 

那是旧的方式。 新的方法是遍历我们所有的插件并返回插件提供的类的hashSet:

 @Override public Set> getClasses() { Set> classes = new HashSet<>(); classes.add(mainAPIStuff.class); classes.addAll(pluginsHelper.getClasses()); return classes; } 

pluginsHelper有各种共享的插件方法和管理工具,比如getClasses(),基本上这样做:

 public static Set> getClasses() { Set> classes = new HashSet<>(); // Probe plugins for their Rest Class implementation List plugins = getCurrentlyInstalledPluginsFromOurSystem(); for (PluginObject plugin : plugins) { Class clazz = plugin.getPluginRestClass(); if (clazz != null) { classes.add(clazz); } } return classes; } 

RestEasy在调用任何目标时动态构建Rest目标,因此所有插件安装,启动,配置都已完成,系统在调用之前处于正确状态。 这是非常有价值的理解,因为那时你可以在调用时完成所有的RestEasy类操作和加载。

我在嵌入式环境中使用Reateasy with Undertow,我手动实例化ResteasyDeployment ,并且注册Resource类非常简单,请参阅代码片段:

  UndertowJaxrsServer undertowJaxrsServer = new UndertowJaxrsServer(); ResteasyDeployment resteasyDeployment = new ResteasyDeployment(); undertowJaxrsServer.start(); resteasyDeployment.start(); final DeploymentInfo undertowDeployment = undertowJaxrsServer .undertowDeployment(resteasyDeployment) .setContextPath("/abc") .setDeploymentName("TEST") .setClassLoader(Thread.currentThread().getContextClassLoader()); undertowJaxrsServer.deploy(undertowDeployment); resteasyDeployment.getRegistry().addSingletonResource(new ResourceApiImpl());