泽西岛注入 RequestScoped IllegalStateException

Jersey Inject RequestScoped IllegalStateException

已经为此工作了几个小时,但似乎没有任何效果。这是泽西岛 2.23.2。我的想法是我想将基于请求的 Hibernate Session 注入 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@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 配置方法中指定 Singleton 而不是 RequestScoped 时,我可以让它绑定,但这不是我想要的。我希望对单个 SessionFactory 的每个请求都有一个新的 Session。

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

你用错了 RequestScoped(你用的是 CDI)。您应该使用 Jersey 专用的。