我有一个我开发的系统,它在会话范围的bean中有一个变量,它已经被破坏了,我相信来自串扰。
我正在使用JSF / Spring / Glassfish / Primefaces。 Spring Framework 4.0.3,Java EE 7.0。
当我进行测试时,一切都在逻辑上正常。但是在有大约十二个并发用户的领域,我看到一个gremlin popup,在一个案例中,一个int变量实际上从网页约束到0-100之间,突然超过15k。
我实际上是Java EE的新手,所以我担心我创建了一个糟糕的设计或类似的东西。在我的软件中,用户使用Spring / JSF安全性登录并创建一个Session bean(用于会话的faces-config.xml
范围内的bean)。
用户登录页面导致在页面流中创建请求bean,以允许用户选择一些基本参数。这些“存储”在会话bean中,用户选择打开新页面的选项,并导致创建另一个请求bean以支持该活动。用户执行一些操作并创建存储到原始会话bean的更多数据。用户执行更多操作并创建新页面和请求bean。等。
基本上,对于每个新页面,我创建一个请求bean,允许用户执行一些活动并返回会话bean。在用户活动的某些状态中,它会定期创建转到数据库的事务。我在每个bean中使用@Named
。
我用:
FacesContext context = FacesContext.getCurrentInstance();
OperatorSessionBean operatorSessionBean = (OperatorSessionBean) context.getApplication().evaluateExpressionGet(context, "#{operatorSessionBean}", OperatorSessionBean.class);
从每个请求bean访问会话bean。
现在,我有一个Primefaces Spinner,它被限制为0-100(以及其他数据输入)。收集完所有数据后,用户提交并在服务该事件时,数据在会话bean中“设置”。我总是使用setter和getter来访问会话数据,并将数据元素设置为私有。
我的主要问题是我是否遗漏了一些重要的东西,即糟糕的设计?
其次,关于如何找到gremlin的任何建议。任何建议将不胜感激!
答案 0 :(得分:0)
为了解决这个问题,我做了很多阅读,并尝试了各种教程中的几种技巧。博客文章http://www.beyondjava.net/blog/integrate-jsf-2-spring-3-nicely/和其他几篇文章一样有用。我发现很多教程和帖子似乎表明这些技术可以无缝地协同工作,但显然他们没有。根据我的阅读和实验,这些不同的技术可以共存,但具有很多(IMO)复杂性。因此,我开始使用标准CDI进行bean作用域。我正在使用@Named和@RequestScoped或@SessionScoped。关键是保持Spring与JSF / CDI相当分离。我仍然纯粹使用Spring作为登录安全性。我发现将Spring bean注入JSF或CDI bean可能会有效,但是序列化等等会有相当多的麻烦。对我来说,增加的复杂性并不值得付出努力。我们最终采用的方法是,使用Spring进行登录安全性,使用正常bean的CDI看起来是稳定的。我唯一的问题是,在特定主机的浏览器中,如果用户打开多个窗口,则共享身份,即您无法合理地使用同一系列浏览器从一台计算机进行多次用户登录。对于测试来说,这有点麻烦,但对于我们的实际应用来说还可以。所以我的基本问题得到了解决。感谢您的评论。