7

Bean@ManagedBeanに置き換えたい作品があります。@Named + @RequestScoped

// Before
@ManagedBean
public class Login {
   ...
}

// After
import javax.enterprise.context.RequestScoped;
@Named
@RequestScoped
public class Login {
   ...
}

私が使用している限り、すべてが正常に機能します@ManagedBean@Named動作しませ@RequestScopedんが、EL式ごとに新しいインスタンスを作成します。@Named + @RequestScopedただし、例外が発生します。リクエストキャッシュがアクティブでない場合、リクエストスコープのキャッシュアイテムを追加できません。

java.lang.IllegalStateException: Unable to add request scoped cache item when request cache is not active
    at org.jboss.weld.context.cache.RequestScopedBeanCache.addItem(RequestScopedBeanCache.java:51)
    at de.prosis.dafe.presentation.Login$Proxy$_$$_WeldClientProxy.getUsername(Login$Proxy$_$$_WeldClientProxy.java)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.el.BeanELResolver.getValue(BeanELResolver.java:302)
    at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    at org.apache.el.parser.AstValue.getValue(AstValue.java:169)
    at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:189)
    at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50)
    at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109)
    at javax.faces.component.ComponentStateHelper.eval(ComponentStateHelper.java:194)
    ...

beans.xmlは存在します。私が気付いていない落とし穴やバグはありますか?私は何かが足りないに違いないが、それはバグのように見える。例外メッセージをグーグルで検索しましたが、それを発生させるクラスのソース以外は見つかりませんでした。前もって感謝します!

更新: 省略したコードに関連しています。ログインBeanは、コンストラクターでセッションを無効にしようとします。これは、名前付きBeanの場合は失敗し(F5をスパムすると、数回後には機能するように見えます)、マネージドBeanとして機能します。誰かがその行動を説明できますか?

public Login() {
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
            if (session != null) {
                session.invalidate();
            }
} 

コードはそのチュートリアルからのものです: http ://www.greenkode.com/2011/09/user-authentication-and-authorization-using-jaas-and-servlet-3-0-login/

4

4 に答える 4

2

私も同じ問題を抱えていました。@ManagedBean (機能していた) から機能しなかった @Named に切り替えました。ほとんどの人が示唆するように、問題を解決しなかった WEB-INF に beans.xml ファイルがありました。@Named と一緒に @Stateless を追加して、理由はわかりませんが機能させることができます! 誰かがそれを説明できるなら、私はそれを聞きたいです.

とにかく、 @Named を機能させる「本当の」方法は次のとおりだと思います。正しい @RequestScoped アノテーションをインポートすると、@Named が機能します。javax.enterprise.context パッケージから。javax.faces.bean パッケージの @RequestScoped アノテーションは、@Named アノテーションと互換性がありません。正しい @RequestScoped を @Named と一緒に省略すると、Bean は起動しますが、プロパティは読み取られません。

ps。私は Glassfish を使っているので、JBoss の問題だとは思えません。

于 2012-11-07T12:15:37.493 に答える
2

コンストラクタでセッションの無効化を削除することで修正しました。@ManagedBean が機能し、@Named が機能しない理由はまだわかりません。

于 2012-06-13T18:02:45.043 に答える
1

これらのシナリオのいずれかの範囲外であるか、JBossAS7にこのような別の問題があると思います。

ところで、リクエストスコープのBeanはシリアル化可能である必要はありません。おそらく@SteveTaylorはそれをセッションスコープのBeanと混合しました。

于 2012-06-13T08:20:56.783 に答える
-1

まだ問題に取り組んでいる人にとって、これは私にとってはうまくいきました(理由はまだ不明です)

私はネットビーンズでGF4を使用しています。Netbeans には、インジェクションと一貫して動作しなかった JSF ページの優れたタブ補完もあります。(現在)リクエストスコープのみをテストしましたが、すべてパッケージに含まれていると思います..

ここに私が使用したすべての組み合わせとその結果があります(ソリューションの上に)

最良の解決策

import javax.faces.bean.RequestScoped; 
import javax.inject.Named; 
//=> Injection ok - Tab Completion OK

その他の少ないまたは不適切な組み合わせ (情報)

import javax.faces.bean.RequestScoped;
import javax.annotation.ManagedBean; 
//=> Injection ok - Tab Completion NOK

import javax.enterprise.context.RequestScoped;
import javax.inject.Named; 
//=> Injection nok - Tab Completion OK 


import javax.enterprise.context.RequestScoped;
import javax.faces.bean.ManagedBean;
//=> Injection nok - Tab Completion OK 


import javax.faces.bean.RequestScoped;
import javax.faces.bean.ManagedBean;
//=> Injection nok - Tab Completion OK


import javax.enterprise.context.RequestScoped;
import javax.annotation.ManagedBean; 
//=> Injection nok - Tab Completion NOK
于 2014-09-15T21:37:22.333 に答える