gpt4 book ai didi

jsf - 不能在另一个@ManagedBean 中@Inject 一个@ManagedBean

转载 作者:行者123 更新时间:2023-12-04 00:47:48 26 4
gpt4 key购买 nike

好的,这是我的 session bean。我总是可以从任何 Servlet 或过滤器中检索 currentUser。那不是问题问题是fileList和currentFile。我已经用简单的 int 和字符串进行了测试,效果相同。如果我从我的 View 范围 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!");
}
}

这是一个例子。

我的 View 范围 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 显示正常,但我看不到该文件。它只是空白。字符串、整数等也会发生同样的事情。

感谢您对此提供的任何帮助。

信息:UserSessionBean:第 3B 行--8531268875812004316.csv(从 View 作用域 bean 打印的值)

信息:文件过滤器 tester.csv(运行过滤器时打印的值。)

**编辑**

这有效。

 FacesContext context = FacesContext.getCurrentInstance();
userSessionBean = (UserSessionBean) context.getApplication().evaluateExpressionGet(context, "#{userSessionBean}", UserSessionBean.class);

我将其放入 ViewScoped 的构造函数中,一切正常。现在为什么注入(inject)没有按照我的想法进行?起初我想可能是因为我使用的是 JSF 托管 bean 而不是新的 CDI bean。但是我把 bean 换成了新的样式(命名),效果是一样的。

注入(inject)是否只允许您访问 bean 而不能更改它们的属性?

最佳答案

您正在混合使用 JSF 和 CDI。您的 UserSessionBean 是一个 JSF @ManagedBean,但您正在使用 CDI @Inject 将它注入(inject)另一个 bean。 CDI 不重用 JSF 管理的一个,而是创建一个全新的。使用其中之一,而不是两者。注入(inject) JSF 管理的 bean 的正确注释是 @ManagedProperty .

替换

@Inject
private UserSessionBean userSessionBean;

通过

@ManagedProperty(value="#{userSessionBean}")
private UserSessionBean userSessionBean;

并确保您的代码(这是 CDI 注释包)中的任何地方都没有 import javax.enterprise.context

或者,将所有 JSF bean 管理注释迁移到 CDI bean 管理注释。

import javax.inject.Named;
import javax.enterprise.context.SessionScoped;

@Named
@SessionScoped
public class UserSessionBean implements Serializable {}

import javax.inject.Named;
import javax.faces.view.ViewScoped;

@Named
@ViewScoped
public class ViewLines implements Serializable {}

额外的优势是您可以在常规 servlet 或过滤器中将其@Inject,而无需手动将其作为请求/ session /应用程序属性获取。

此外,自 JSF 2.3 起,JSF bean 管理注释已被弃用。另见 Backing beans (@ManagedBean) or CDI Beans (@Named)?

关于jsf - 不能在另一个@ManagedBean 中@Inject 一个@ManagedBean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5303331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com