没有活动的事件上下文——RESTeasy、Seam

No event context active - RESTeasy, Seam

我正在尝试使用 Seam2 在 JBoss 7.x 上向我们的应用程序 运行 添加带有 RESTeasy 的 RESTful Web 服务。

我想尽可能少地使用 Seam,但我需要它来进行依赖注入。

我的 REST 端点如下:

@Name("myEndpoint")
@Stateless
@Path("/path")
@Produces(MediaType.APPLICATION_JSON+"; charset=UTF-8")
public class MyEndpoint {
  @In private FooService fooService;

  @GET
  @Path("/foo/{bar}")
  public Response foobar(@CookieParam("sessionId") String sessionId, 
                             @PathParam("bar") String bar)
  { ... }
}

我正在使用 class 扩展 Application。没有 XML 配置。 我可以使用 Web 服务方法并且它们有效,但我总是得到 IllegalStateException:

Exception processing transaction Synchronization after completion: java.lang.IllegalStateException: No event context active

Complete StackTrace

我确实尝试了 documentation 中的所有内容,但我无法摆脱它。如果我省略了 @Stateless 注释,我就不会完成任何注入。添加 @Scope 不会做杰克。通过 seam/resource/ 访问服务甚至不起作用(即使没有使用 @ApplicationPath 的应用程序 class)。

如果我不使用 Dep,它就会消失。注入,而是添加到每个方法

fooService = Component.getInstance("fooService");
Lifecycle.beginCall();
...
Lifecycle.endCall();

这不是一个很好的解决方案。 不,也行不通...

我已经解决了这个问题。出于某种原因(仍然不确定为什么,可能是因为我试图单独使用注释和代码并且没有 XML 配置),我的 REST 服务在 "non-standard" URL 下可用。

通常类似于“/seam/resources/rest”。

无论如何,如果您有 "custom" 路径,Seam 不知道它应该注入上下文。您需要将 <web:context-filter url-pattern="something" /> 添加到 component.xml

具体来说,我们已经有了这个标签,但带有 regex-url-pattern 属性,我扩展它以匹配 REST URL。