RESTEasy - 动态添加资源类

时间:2011-08-10 21:25:49

标签: java rest resteasy

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

3 个答案:

答案 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());