当前位置: 首页 > 知识库问答 >
问题:

泽西岛注入请求范围非法状态异常

曾光远
2023-03-14

这件事已经做了几个小时了,似乎什么也做不成。它是Jersey 2.23.2。我想将一个基于请求的Hibernate会话注入Jersey提供程序,以便在我的REST API中使用。相反,我得到的是:

javax.servlet.ServletException: A MultiException has 2 exceptions.  They are:
1. java.lang.IllegalStateException: Could not find an active context for javax.enterprise.context.RequestScoped
2. java.lang.IllegalStateException: While attempting to create a service for SystemDescriptor(
    implementation=com.pixmoto.api.server.SFFactory
    contracts={org.hibernate.Session}
    scope=javax.enterprise.context.RequestScoped
    qualifiers={}
    descriptorType=PROVIDE_METHOD
    descriptorVisibility=NORMAL
    metadata=
    rank=0
    loader=org.glassfish.hk2.utilities.binding.AbstractBinder$2@6e9becd5
    proxiable=null
    proxyForSameScope=null
    analysisName=null
    id=129
    locatorId=0
    identityHashCode=1082491454
    reified=true) in scope javax.enterprise.context.RequestScoped an error occured while locating the context

这是我的代码

public class JerseyResourceConfig extends ResourceConfig {

    public JerseyResourceConfig() {
        packages(this.getClass().getPackage().getName() + ";org.codehaus.jackson.jaxrs");

        register(new AbstractBinder(){
            @Override
            protected void configure() {
                bindFactory(SFFactory.class)
                .to(Session.class)
                .in(RequestScoped.class);
            }
        });
    }
}

public class App {

    private static final Logger logger = LogManager.getLogger(App.class);

    public static void main(String[] args) throws Exception {

        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);

        Server jettyServer = new Server(8080);

        Slf4jRequestLog requestLog = new Slf4jRequestLog();
        requestLog.start();
        jettyServer.setRequestLog(requestLog);

        ClassList classlist = ClassList.setServerDefault(jettyServer);
        classlist.addAfter(
                "org.eclipse.jetty.webapp.FragmentConfiguration", 
                "org.eclipse.jetty.plus.webapp.EnvConfiguration", 
                "org.eclipse.jetty.plus.webapp.PlusConfiguration");

        jettyServer.setHandler(context);

        JerseyResourceConfig config = new JerseyResourceConfig();
        ServletHolder servlet = new ServletHolder(new ServletContainer(config));
        context.addServlet(servlet, "/*");

        try {
            jettyServer.start();
            jettyServer.join();
        } catch (Exception ex) {
            logger.error(ex);
            throw ex;
        } finally {
            jettyServer.destroy();
        }
    }
}

@Path("/api/users")
@Produces(MediaType.APPLICATION_JSON)
public class UserProvider {

    @Inject
    private javax.inject.Provider<Session> session;

    @GET
    public List<User> getUsers() {

        Session s = session.get();
        List<User> users = s.createQuery( "from User", User.class).getResultList();
        return users;
    }
}

public class SFFactory implements Factory<Session> {

    private final SessionFactory sessionFactory;

    public SFFactory() {

     this.sessionFactory = new Configuration()
                .configure() // configures settings from hibernate.cfg.xml
                .buildSessionFactory();
    }

    @Override
    public Session provide() {
        return sessionFactory.openSession();
    }

    @Override
    public void dispose(Session session) {
        if (session.isOpen()) {
            session.close();
        }
    }
}

我已经尝试了上百种排列方式。不知疲倦地在网上搜索。因为我一直没有明确地看着这个问题,所以我认为它一定很简单。

当我在 AbstractBinder 配置方法中指定单例而不是请求范围时,我可以将其绑定,但这不是我想要的。我希望在单个会话工厂的每个请求上都有一个新的会话。

我没有头发要拔了。任何帮助都将不胜感激。

共有1个答案

邵子平
2023-03-14

您使用了错误的< code>RequestScoped(您使用的是CDI)。你应该用球衣专用的。

  • 组织.玻璃鱼.泽西.过程.内部.请求范围
 类似资料:
  • 我很难理解泽西岛的注入机制。JAX-RS规范(http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-520005)指出,在应用程序子类、根资源类和提供程序中可以通过@Context进行注入。 我现在有一个在启动时实例化的类,并且有一个在每次请求时调用的方法。在方法内部,我需要访问当前的UriInfo对象。问题是,这个方法不是从我的

  • 我正在学习并尝试构建一个rest api。但是我很难理解各种绑定之间的区别-、、以及范围-、和。它们之间有什么区别以及何时使用哪一个? e、 g.假设我有一些特定于请求的数据传入请求头。我想在请求处理期间多次使用此数据(比如在资源类、DAO等中)。我想到的是,我将使用,并使用 ContainerRequestContext提取数据,然后将其存储到某个类中。但我无法确定如何绑定这个类,以便以后可以访

  • 我正在编写一个公开 REST API 的简单微服务。所以我开始使用泽西岛,当然我需要将我的对象注入球衣资源中。基本上,我有2个类来定义一组资源,其中一些需要使用另一个服务。 所以基本上我有: } 该接口的2种实现(MyServiceBean和My备选ServiceBean) 而且,就我对阅读新泽西文件的理解,我定义了一个hk2活页夹: 我将此活页夹注册到ApplicationConfig类 } 并

  • 我试图理解异步响应在Jersey上的工作方式。我阅读了新泽西文档(https://jersey.java.net/documentation/latest/async.html)的第10章,但它对我的问题没有帮助。这里关于stackoverflow的研究也没有得出令人满意的答案(这一点我可以理解)。 我试图做的与本文中的一个问题类似(使用http状态202进行异步操作)。我想使用HTML表单文档将

  • 问题内容: 我有一个Jersey REST API,并且正在使用来处理授权。我还在所有端点上使用,以便我的API可以处理数千个并发请求。 我的授权过滤器命中了一个远程服务,但是当运行过滤器时,Jersey尚未将当前线程添加到它的内部,因此我完全失去了异步的好处。 我可以告诉Jersey我希望这是异步的吗? 这是一个示例资源: 更新 刚刚收到泽西队球员的回音,从2.7开始,这是不可能的。只有资源方法

  • 我试图将资源的实例注入具有Singleton作用域的JAX-RS应用程序,但当我这样做时,我得到: 警告:在服务器运行时中注册的提供程序com.test.jersey.app.MyResource未实现任何适用于服务器运行时的提供程序接口。由于约束配置问题,将忽略提供程序com.test.jersey.app.MyResource。 我有一个如下的应用程序,它需要一个已经运行的MyResource