解释与类和实例相关的RestEasy提供者,资源和单例?

时间:2012-04-11 23:59:53

标签: rest resteasy

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

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

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

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

    classes.add(SomeComponent.class);

我认为我缺少关于类如何作为制作实例的工厂的Java概念的知识,以及这两者如何与RestEasy调用类,单例(单例ARE类,但RestEasy将它们注册为实例)相关联的知识和资源(实例?)。

我怀疑我最终需要动态注册新实例,但无法找到办法。鉴于ServletContext,我确实找到了一种方法,但我也无法访问它。有人能让我走上正轨吗?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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文件中定义。

答案 2 :(得分:0)

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

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

当然,我理解这一点,并随时纠正我。我的重点是让这个应用程序播出,而不是探索RestEasy,REST的每个角落,当然不是Spring。

相关问题