使用RESTEasy我已经实现了Application的子类来提供单例资源列表。有没有办法在以后动态添加另一个单身?我没有找到一种方法从API文档中做到这一点。
答案 0 :(得分:1)
我自己没试过,但是我发现了一篇博文,其中描述了这一点: 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);
答案 1 :(得分:1)
我自己尝试过这种方法,尽管它很神经兮兮,但效果很好。我们的基础架构中有几个独立项目(插件)由我们的主应用程序导入和加载,我们希望在现有的RestEasy API(和Swagger文档)中包含对它们的访问。
我们最初将类加载硬编码到我们的主要Rest Application类中,该类需要在我们的API中始终显示所有插件。为了避免这种情况并重新设置这些项目的独立性(在任何给定时间都可以包含所有项目,一些项目或者没有项目),我们创建了返回特征/目标类本身的动态方法,该方法在引导阶段加载RestEasy框架。它就像一个魅力。
在我们的Rest Application类中,我们按如下方式实现它:
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> 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<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<>();
classes.add(mainAPIStuff.class);
classes.addAll(pluginsHelper.getClasses());
return classes;
}
pluginsHelper有各种共享的插件方法和管理工具,比如getClasses(),基本上就是这样:
public static Set<Class<?>> getClasses() {
Set<Class<?>> 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类操作和加载。
答案 2 :(得分:0)
我在嵌入式环境中使用Reateasy with Undertow,我手动实例化ResteasyDeployment
,注册资源类非常简单,请参阅代码片段:
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());