1

我正在构建一个由储藏室和工作场所组成的 JAX-RS 应用程序。库房拥有一组 Java 类,可以实例化(通过 AJAX)以在工作场所创建这些类的命名实例。

到目前为止,我可以通过在 RestEasy 应用程序中将它们声明为“单身人士”来引用仓库和工作场所的罚款

    singletons.add(StockPlace.getInstance());
    singletons.add(WorkPlace.getInstance());

我无法理解如何理解应该如何处理库房内容类。我想要达到的效果是,当我动态创建库类之一的实例时,可以通过 REST 命令动态访问该实例。我尝试了以下各种排列:

    classes.add(SomeComponent.class);

我想我缺少关于类如何作为创建实例的工厂的 Java 概念的知识,以及这两者如何与 RestEasy 所称的类、单例(单例是类,但 RestEasy 将它们注册为实例)和资源(实例?)。

我怀疑我最终需要动态注册新实例,但也找不到这样做的方法。在给定 ServletContext 的情况下,我确实找到了一种方法,但我也无法访问它。有人可以让我走上正确的轨道吗?

4

3 回答 3

1

我们对这个问题的最终回答是退出 RestEasy 并转换为DropWizard。这个问题和许多其他问题都消失了,一切都变得容易了。

于 2012-12-24T20:40:31.780 回答
0

由于我没有找到不涉及将另一整层复杂性(Spring)绑定到 RestEasy 的答案,因此我发现可行的解决方案在上面的最终评论中进行了概述。也就是说,不要依赖于向实例发送远程消息,除非应用程序是真正无状态的(例如,实例不会跨消息持续存在)。仅将远程消息发送到在请求中持续存在的单例。每条这样的消息都可以识别所需的实例(在我的例子中通过 String id),并且单例可以作为普通 POJO 转发到识别的实例。

我仍然不明白为什么 RestEasy 无条件地将非单例(实例)视为短暂的。无状态不是对 REST 的限制,只是对何时可以使用 GET 方法(幂等调用)的限制。PUT 和 POST 调用既不是无状态的也不是幂等的。

当然,据我了解,请随时纠正我。我的重点是让这个应用程序上线,而不是探索 RestEasy、REST 的每一个角落,当然也不是 Spring。

于 2012-05-06T18:14:40.553 回答
0

我相信我知道你在追求什么,但我至少应该让你朝着正确的方向前进。

您需要将带注释的 RESTEasy 类添加到注册表中。下面是我用于最近项目的类。它添加到单例中(根据您所做的),但它也添加到注册表中。

public class RESTEasyServerApplication extends javax.ws.rs.core.Application
{
    // The RESTEasy registry
    @Autowired
    protected org.jboss.resteasy.spi.Registry registry;

    // The annotated RESTEasy handler classes
    private Set<Object>  singletons = new HashSet<Object>();
    private List<Object> handlers   = new ArrayList<Object>();

    public RESTEasyServerApplication()
    {}

    @Override
    public Set<Object> getSingletons()
    {
        return singletons;
    }

    // Spring injection support
    public void setHandlers( List<Object> handlers )
    {
        for( Object handler : handlers )
        {
            if( registry != null )
            {
                // Save a reference to the handler
                this.handlers.add( handler );

                // Register the handler with RESTEasy
                registry.addSingletonResource( handler );
            }

            singletons.add( handler );
        }
    }

    // Spring injection support
    public List<Object> getHandlers()
    {
        return handlers;
    }
}

我用的是Spring,下面是相关配置:

<!-- RESTeasy/Spring integration -->
<import resource="classpath:springmvc-resteasy.xml" />

<!-- RESTeasy server application -->
<bean id="application" class="blah.blah.resteasy.RESTEasyServerApplication">
    <property name="handlers">
        <list>
            <!-- Application specific handler classes -->
            <ref bean="sample"/>
        </list>
    </property>
</bean>

应该很容易修改/添加一个方法来接受单个带注释的 RESTEasy 类并使其根据需要动态工作。注册表在 springmvc-resteasy.xml 文件中定义。

于 2012-04-12T03:00:01.770 回答