【发布时间】:2011-07-15 06:29:56
【问题描述】:
好的,这是我的会话 bean。我总是可以从任何 Servlet 或过滤器中检索 currentUser。那不是问题 问题是fileList 和currentFile。我已经用简单的 int 和 Strings 进行了测试,它的效果相同。如果我从我的视图范围 bean 中设置一个值,我可以从另一个类中获取数据。
@ManagedBean(name = "userSessionBean")
@SessionScoped
public class UserSessionBean implements Serializable, HttpSessionBindingListener {
final Logger logger = LoggerFactory.getLogger(UserSessionBean.class);
@Inject
private User currentUser;
@EJB
UserService userService;
private List<File> fileList;
private File currentFile;
public UserSessionBean() {
fileList = new ArrayList<File>();
currentFile = new File("");
}
@PostConstruct
public void onLoad() {
Principal principal = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal();
String email = principal.getName();
if (email != null) {
currentUser = userService.findUserbyEmail(email);
} else {
logger.error("Couldn't find user information from login!");
}
}
这是一个例子。
我的视图范围 bean。这就是它的装饰方式。
@ManagedBean
@ViewScoped
public class ViewLines implements Serializable {
@Inject
private UserSessionBean userSessionBean;
现在是代码。
userSessionBean.setCurrentFile(file);
System.out.println("UserSessionBean : " + userSessionBean.getCurrentFile().getName());
我可以完美地看到当前文件名。这实际上是从 jsf 操作方法打印出来的。所以很明显 currentFile 正在被设置。
现在如果我这样做。
@WebFilter(value = "/Download")
public class FileFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpSession session = ((HttpServletRequest) request).getSession(false);
UserSessionBean userSessionBean = (UserSessionBean) session.getAttribute("userSessionBean");
System.out.println(userSessionBean.getCurrentUser().getUserId()); //works
System.out.println("File filter" + userSessionBean.getCurrentFile().getName()); //doesn't work
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
currentUser 显示正常,但我看不到文件。它只是空白。字符串、整数等也会发生同样的事情。
感谢您对此提供的任何帮助。
INFO:UserSessionBean:第 3B 行--8531268875812004316.csv(从视图范围 bean 打印的值)
INFO:文件过滤器 tester.csv(运行过滤器时打印的值。)
**编辑**
这行得通。
FacesContext context = FacesContext.getCurrentInstance();
userSessionBean = (UserSessionBean) context.getApplication().evaluateExpressionGet(context, "#{userSessionBean}", UserSessionBean.class);
我把它放在 ViewScoped 的构造函数中,一切都很好。现在为什么注入没有按照我的想法进行?起初我想可能是因为我使用的是 JSF 托管 bean 而不是新的 CDI bean。但是我把豆子改成了新的样式(带命名的),效果是一样的。
注入是否只允许您访问 bean 而不能更改它们的属性?
【问题讨论】:
-
功能需求是什么?您是否意识到
Filter在 JSF 之前运行? -
是的。我基本上想删除会话侦听器中的文件。那也行不通。该文件永远不会在会话 bean 中。我一直在使用过滤器作为测试方法。我还想对用户会话应用一个令牌,这样当他们点击 servlet 时,用户会话对象必须定义该字符串才能下载文件。只是一些额外的安全性。这不是必须的。我想在会话 bean 中再存储一些东西。我现在无法存储任何东西,并且能够访问一个视图范围 bean 之外的数据。
-
会话监听器应该是正确的工具。如果文件不存在,那么您只是在访问错误的 bean 或覆盖 bean 和/或其他地方的文件列表。运行调试器。
-
嘿巴鲁斯。使用 faces 上下文在 viewscoped bean 中获取 sessionbean 效果很好。 bean 在过滤器和 servlet 以及 sessionListener 中显示更新的值..!这是怎么回事?
标签: jsf cdi managed-bean inject