- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个 Web 应用程序,我尝试在其中集成 Vaadin 和 DB4O 以及在 TomEE 容器中运行的 CDI。为了进行数据库事务,我创建了 ServletFilter,它拦截所有请求并在请求结束时提交或回滚。
@WebFilter("/*")
public class DBTransactionHandler implements Filter {
@Inject
SessionImpl sessionImpl;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
boolean hadException = false;
try {
chain.doFilter(request, response);
} catch (RuntimeException ex) {
hadException = true;
throw ex;
} finally {
if (sessionImpl != null) {
if (hadException || sessionImpl.isRollbackOnly()) {
sessionImpl.rollback();
} else {
sessionImpl.commit();
}
sessionImpl.close();
}
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
我有一个 SessionImpl,它被设置为@RequestScoped
。通过这个,我试图实现所有在处理 HTTP 请求时需要使用数据库的服务,然后它们应该获得相同的实例,因此它将在相同的数据库事务中执行。
/**
* http://community.versant.com/documentation/reference/db4o-8.0/java/reference/Content/platform_specific_issues/web/servlets.htm
*/
@RequestScoped
public class SessionImpl implements Session {
@Inject
DBConnectionFactory connectionFactory;
private boolean rollbackOnly;
private ObjectContainer delegate;
@PostConstruct
public void init() {
delegate = connectionFactory.getConnection().ext().openSession();
}
//.... many other database related methods
}
我的所有服务均源自 AbstractService
,因此它们可以立即启动工作 session 。
public class AbstractService {
@Inject
protected BeanManager beanManager;
@Inject
protected Session db;
}
这就是我目前所拥有的,这就是我的问题:
在我的网络应用程序中,我需要创建一个调度程序组件。预定的作业将使用我已有的相同服务。由于 SessionImpl
是 @RequestScoped
并且我在计划作业中没有 HTTP 请求,因此无法注入(inject) SessionImpl。
我试图做的是创建一个自定义范围@SchedulerScoped
。这将在调度程序开始执行作业之前激活。这种方法的问题是,当我向 SessionImpl 添加第二个作用域时,我的应用程序不再部署:
SEVERE: CDI Beans module deployment failed
org.apache.webbeans.exception.WebBeansConfigurationException: Managed Bean implementation class : org.reluxa.db.SessionImplstereotypes must declare the same @Scope annotations.
at org.apache.webbeans.config.DefinitionUtil.defineScopeType(DefinitionUtil.java:390)
at org.apache.webbeans.component.creation.AbstractBeanCreator.defineScopeType(AbstractBeanCreator.java:145)
at org.apache.webbeans.util.WebBeansUtil.defineManagedBean(WebBeansUtil.java:2548)
at org.apache.openejb.cdi.BeansDeployer.defineManagedBean(BeansDeployer.java:552)
at org.apache.openejb.cdi.OpenEJBLifecycle.deployManagedBeans(OpenEJBLifecycle.java:407)
最佳答案
这是一个有趣的问题。我建议将以下内容作为解决方案的概要我实际上还没有尝试过,因此需要进行一些调整:
SessionImpl
非 CDI:删除 @RequestScoped
、@Inject
。使用创建 Session
的生产者方法创建一个 CDI bean,如下所示:
// I believe it should be @ApplicationScoped
public class SessionProducer {
private ThreadLocal<Session> currentSession;
@Produces Session makeSession() {
return currentSession.get();
}
public ThreadLocal<Session> getCurrentSessionThreadLocal() {
return currentSession;
}
}
因此 session 驻留在 ThreadLocal
中,生产者只是从那里获取它。谁把它放在那里?
修改过滤器以将Session
放入和删除ThreadLocal
中:
@WebFilter("/*")
public class DBTransactionHandler implements Filter {
@Inject
DBConnectionFactory connectionFactory;
@Inject
SessionProducer sessionProducer;
...
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
boolean hadException = false;
try {
SessionImpl sessionImpl = new SessionImpl();
sessionImpl.setConnectionFactory(connectionFactory);
sessionProducer.getCurrentSessionThreadLocal().set(sessionImpl);
// here you probably want to call sessionImpl.init();
chain.doFilter(request, response);
} catch (RuntimeException ex) {
hadException = true;
throw ex;
} finally {
if (sessionImpl != null) {
if (hadException || sessionImpl.isRollbackOnly()) {
sessionImpl.rollback();
} else {
sessionImpl.commit();
}
sessionImpl.close();
sessionProducer.getCurrentSessionThreadLocal().set(null);
}
}
}
...
}
到目前为止,您的 Web 配置应该可以像以前一样工作。根据需要进行测试和调整。 (请测试每个线程仅生成一个 session 。)
SessionImpl
创建和销毁仪式。这样,服务仍然会看到有效的Session
,而不需要请求范围。这个“仪式”可能会被排除在外(例如,执行这些操作的调度程序的 CDI 或 EJB 拦截器是可重用的,并且不会用这样的系统逻辑污染组件的业务逻辑)。关于java - 将数据库 session 注入(inject)服务的调度程序的 CDI 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21039429/
是否为每个 Shiny session 分配了 session ID/ session key (如果部署在 Shiny 服务器上)?如果是,我如何访问该信息?我已阅读文档here然而上网查了一下,并
我正在使用 this koajs session 模块。 我检查了源代码,但我真的无法理解。 我想知道它保存 session 数据的位置,因为我没有看到创建的文件,并且当服务器重新启动时, sessi
实现高可扩展性的一种方法是使用网络负载平衡在多个服务器之间分配处理负载。 这种方法提出的一个挑战是服务器是否具有状态意识 - 将用户状态存储在“ session ”中。 此问题的一个解决方案是“粘性
在负载平衡服务器的上下文中, session 亲和性和粘性 session 之间有什么区别? 最佳答案 我见过这些术语可以互换使用,但有不同的实现方式: 在第一个响应中发送 cookie,然后在后续响
我希望其他人向我解释哪种方法更好:使用 session 或设计无 session 。我们正在开始开发一个新的 Web 应用程序,但尚未决定要遵循什么路径。 无 session 设计在我看来更可取: 优
现在用户在他的权限中有很多角色,我将允许他点击 href 并在新窗口中扮演另一个角色。每个角色都有自己的 session 。 既然浏览器打开窗口不能用新 session 打开,我必须在服务器端想办法。
我正在尝试为express.js Node 应用程序实现 session 存储我的问题是: 如何删除具有浏览器 session 生命周期的 cookie(根据连接文档标记有 expires = fal
在开始在 golang 中使用 session 之前,我需要回答一些问题 session 示例 import "github.com/gorilla/sessions" var store = ses
我读过 Namespaced Attributes . 我尝试使用此功能: #src/Controller/CartController.php public function addProduct(
我正在努力完成以下工作: 根据用户的类型更改用户的 session cookie 到期日期。 我有一个 CakePHP Web 应用程序,其中我使用 CakePHP session 创建了我的身份验证
这是我在这里的第一个问题,我希望我做对了。 我需要处理一个 Java EE 项目,所以在开始之前,我会尝试做一些简单的事情,看看我是否能做到。 我坚持使用有状态 session Bean。 这是问题:
ColdFusion session 与 J2EE session 相比有什么优势吗? ColdFusion session documentation提到了 J2EE session 的优点,但没有
在执行任何任务之前,我需要准确地在创建 session 时创建一个 session 范围变量(因为我的所有任务都需要一个初始 session 范围变量才能运行)。因为,创建 session 时,gra
我们当前的应用使用 HTTP session ,我们希望将其替换为 JWT。 该设置仅允许每个用户进行一次 session 。这意味着: 用户在设备 1 上登录 用户已在设备 1 上登录(已创建新 s
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
假设我在两个或更多设备上打开了两个或更多用户 session (同一用户没有管理员权限)。 在当前 session 中,如果我注销,是否意味着所有其他 session 也会关闭?如果没有,有没有办法通
我正在评估在 tomcat 中使用带有 session 复制的粘性 session 的情况。根据我的初步评估,我认为如果我们启用 session 复制,那么在一个 tomcat 节点中启动的 sess
我开始使用 golang 和 Angular2 构建一个常规的网络应用程序,最重要的是我试图在 auth0.com 的帮助下保护我的登录.我从 here 下载快速入门代码并尝试运行代码,它运行了一段时
我在 Spring Controller 中有一个方法,它接受两个相同类型的参数其中一个来自 session ,另一个来自表单提交(UI)。 问题是在 Controller 方法中我的非 sessio
在我登录之前,我可以点击我的安全约束目录之外的任何内容。如果我尝试转到安全约束目录内的某个位置,它会将我重定向到表单登录页面。如您所料。 登录后,我可以继续我的业务,并访问我的安全约束内外的资源。
我是一名优秀的程序员,十分优秀!