Хорошо, вот мой сеансовый компонент. Я всегда могу получить currentUser из любого сервлета или фильтра. Проблема не в этом. Проблема в fileList и currentFile. Я тестировал простые int и Strings, и это тот же эффект. Если я установлю значение из моего компонента с областью видимости, я смогу получить данные из другого класса.
@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 отображается нормально, но я не вижу файл. Это просто пусто. То же самое происходит со строками, целыми числами и т. д.
Спасибо за любую помощь, которую вы можете предоставить по этому вопросу.
ИНФОРМАЦИЯ: UserSessionBean: строка 3B--8531268875812004316.csv (значение, напечатанное из bean-компонента с областью видимости)
ИНФОРМАЦИЯ: файл filter tester.csv (значение печатается при запуске фильтра).
**РЕДАКТИРОВАТЬ**
Это сработало.
FacesContext context = FacesContext.getCurrentInstance();
userSessionBean = (UserSessionBean) context.getApplication().evaluateExpressionGet(context, "#{userSessionBean}", UserSessionBean.class);
Я поместил это в конструктор ViewScoped, и все было в порядке. Теперь, почему инъекция не делает то, что я думал? Сначала я подумал, может быть, потому, что я использовал управляемые компоненты JSF вместо новых компонентов CDI. Но я изменил бины на новый стиль (с именем), и эффект был тот же.
Позволяет ли инъекция только получить доступ к компонентам, но не изменять их атрибуты?