Джерси Inject RequestScoped IllegalStateException

Работал над этим в течение нескольких часов, и ничего не работает. Это Джерси 2.23.2. Идея состоит в том, что я хочу внедрить сеанс Hibernate на основе запроса в поставщика Джерси для использования в моем 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();
        }
    }
}

Я пробовал то, что кажется сотнями перестановок. Неустанно искал в сети. Пока я смотрел на это без разрешения, я полагал, что это должно быть что-то действительно простое.

Я могу заставить его привязываться, когда я указываю Singleton, а не RequestScoped в методе конфигурации AbstractBinder, но это не то, чего мне хотелось бы. Мне нужен новый сеанс для каждого запроса для одного SessionFactory.

У меня больше нет волос, которые можно было бы вырвать. Любая помощь будет очень признательна.


person ptoinson    schedule 03.09.2016    source источник


Ответы (1)


Вы используете неправильный RequestScoped (вы используете CDI). Вы должны использовать конкретный Джерси.

person Paul Samsotha    schedule 04.09.2016
comment
Я как раз возвращался сюда, чтобы ответить на это сам. Вы совершенно правы. Я знал, что это должно быть просто. Хорошо, что мне не понадобились эти 5 часов сегодня. Спасибо, что заглянули. - person ptoinson; 04.09.2016
comment
Спасибо. Это помогло мне. Я бы и не подозревал о необходимости ссылаться на этот класс из-за internal в имени пакета. - person Gary Sheppard; 13.11.2019