Работал над этим один час и ничего не работает. Это Джерси 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.
У меня больше нет волос, чтобы вытащить. Любая помощь будет чрезвычайно оценена.
Я просто возвращаюсь сюда, чтобы ответить на этот вопрос сам. Вы совершенно правы. Я знал, что это должно быть просто. Хорошо, что мне не нужно было 5 часов сегодня. Спасибо, что посмотрели. – ptoinson