5

Session スコープの Bean があります

import javax.faces.bean.SessionScoped;
import javax.inject.Named;
@Named
@SessionScoped
public class SessionBean implements Serializable{

オブジェクトを1つのフィルターに注入します...

public class FiltroSeguridad implements Filter{

@Inject
private SessionBean sessionBean;

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  HttpServletRequest httpRequest = (HttpServletRequest) request;
  sessionBean.setRutaRedirect(httpRequest.getRequestURI());
}
}

しかし、次の対話で SessionBean を注入します...

@Model
public class CuentaUsuarioWebBean implements Serializable{
 @Inject
 private SessionBean sessionBean;

public void loginUsuario() throws IOException{
   sessionBean.getRutaRedirect();
}

}

しかし、プロパティgetRutaRedirect()は null を返します

CDI アノテーションでインポートを変更してもまだ機能しない ( javax.enterprise.context.SessionScoped)、JSF アノテーションと同じ (javax.faces.bean.ManagedBeanおよび@ManagedProperty)。

ありがとう。

PD: 私の英語でごめんなさい!

4

2 に答える 2

30

javax.faces.bean.SessionScopedJSF とimport javax.inject.NamedCDIに使用している 2 つのパッケージのアノテーションを混在させることはできません。どちらも異なる注入メカニズムを反映しており、同じ Bean で混合することはできません。同じパッケージから両方のアノテーション (インジェクションと Bean スコーピング用) を選択する必要があります。対応するパッケージから次のセットを使用します

CDI ベースの Bean 定義の場合

javax.enterprise.context.SessionScoped //for bean scoping
javax.inject.Named //for bean declaration
javax.inject.Inject //for injection

JSF ベースの Bean 定義の場合

javax.faces.bean.SessionScoped //for bean scoping
javax.faces.bean.ManagedBean //for bean declaration
javax.faces.bean.ManagedProperty //for bean injection

編集:これで、要件をよりよく理解できました。次の構成を使用して、JSF マネージド Bean を注入します。

 @ManagedProperty(value="#{yourBeanName}")
 SessionBean yourSessionBean;

また、JSF 内では、ターゲットよりも広いスコープの Bean のみを注入できることに注意してください。たとえば、@SessionScopedBean を Bean に注入できますが、その逆はでき@RequestScopedません。

ただし、JSF マネージド Bean は非推奨であるため、CDI マネージド Bean を使用することをお勧めします。その場合、スコープの短い Bean をより広いスコープの Bean に注入できます

于 2013-01-20T22:10:47.270 に答える
5

マネージド Bean のことは忘れてください。そのようにフィルターでは機能しません。それを使用することを主張する場合は、ここに記載されている回答に従って適切に使用してください。

JSFでログインフィルタを実装するにはどうすればよいですか?

CDI に関しては、特定の値が null であることが問題であり、実際に NPE などを取得してこれを確認した場合 (たとえば、Eclipse デバッガーが時々間違っているため)。次に、kolossus で説明されているように正しい SessionScoped を使用したことを再確認し、BalusC が言ったこと (beans.xml) も確認します。

CDI が機能しているかどうかを確認する良い方法は、管理者に Bean について尋ねることです。このデバッグ コードをどこかに置いて、試してみてください。

@Inject
BeanManager manager;

@PostConstruct
private void test() {
    Bean<?> bean = (Bean) manager.resolve(manager.getBeans("ANY_NAMED_BEAN_EL_NAME"));
        System.out.println(bean);

}
于 2013-01-21T18:52:58.313 に答える