これが私のセッション Bean です。任意のサーブレットまたはフィルターからいつでも currentUser を取得できます。それは問題ではありません 問題は fileList と currentFile です。単純な int と String でテストしたところ、同じ効果が得られました。ビュー スコープ 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 は正常に表示されますが、ファイルが表示されません。それはちょうど空白です。String や int などでも同じことが起こります。
これについてあなたが提供できる助けをありがとう。
INFO: UserSessionBean : Line 3B--8531268875812004316.csv (ビュー スコープ Bean から出力された値)
情報: ファイル フィルター tester.csv (フィルターの実行時に出力される値)
**編集**
これはうまくいきました。
FacesContext context = FacesContext.getCurrentInstance();
userSessionBean = (UserSessionBean) context.getApplication().evaluateExpressionGet(context, "#{userSessionBean}", UserSessionBean.class);
これをViewScopedのコンストラクターに入れましたが、すべて問題ありませんでした。では、なぜインジェクトが私が思っていたように機能しないのですか? 最初は、新しい CDI Bean の代わりに JSF マネージド Bean を使用していたのではないかと考えました。しかし、Bean を新しいスタイル (名前付き) に変更しましたが、それは同じ効果でした。
インジェクトは Bean へのアクセスのみを許可し、それらの属性を変更することはできませんか?