我正在构建一个由库房和工作场所组成的JAX-RS应用程序。库房拥有一组Java类,可以实例化(通过AJAX)来创建工作场所中这些类的命名实例。
到目前为止,我可以通过在RestEasy应用程序中将它们声明为“单身人士”来引用库房和工作场所的罚款
singletons.add(StockPlace.getInstance());
singletons.add(WorkPlace.getInstance());
我无法理解如何理解应如何处理库房内容类。我想要实现的效果是,当我动态创建其中一个库房类的实例时,可以通过REST命令动态访问该实例。我尝试了各种各样的排列:
classes.add(SomeComponent.class);
我认为我缺少关于类如何作为制作实例的工厂的Java概念的知识,以及这两者如何与RestEasy调用类,单例(单例ARE类,但RestEasy将它们注册为实例)相关联的知识和资源(实例?)。
我怀疑我最终需要动态注册新实例,但无法找到办法。鉴于ServletContext,我确实找到了一种方法,但我也无法访问它。有人能让我走上正轨吗?
答案 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。