2016-09-03 5 views
2

Работал над этим один час и ничего не работает. Это Джерси 2.23.2. Идея состоит в том, что я хочу ввести сеанс Hibernate на основе запроса в провайдер Джерси для использования в моем REST API. Вместо этого, я получаю это:Jersey Inject RequestScoped IllegalStateException

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 
    [email protected]ecd5 
    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 в методе configureBindBinder, но это не то, что я хотел бы. Я хотел бы получить новый Сессия по каждому запросу для одного SessionFactory.

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

ответ

4

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

+0

Я просто возвращаюсь сюда, чтобы ответить на этот вопрос сам. Вы совершенно правы. Я знал, что это должно быть просто. Хорошо, что мне не нужно было 5 часов сегодня. Спасибо, что посмотрели. – ptoinson

Смежные вопросы