0

Maven、jsf 2.0、Java ee 6、jpa、およびグラスフィッシュを使用しています。サインインするか登録するかを尋ねる最初の Web ページがあります。彼らがサインインしたいと言うと、ユーザー名とパスワードのテキスト ボックスを含むログイン ページを表示する facelets/primefaces 3 に転送されます。ユーザー名テキスト フィールドの場合、その値は

value="#{authenticator.username}"

そして私は

「ターゲットに到達できません。識別子 'authenticator' が null に解決されました」

私は beans.xml を使用しています。CDI Bean の命名規則に従っています。Authenticator コンストラクターにログ メッセージを挿入しましたが、メッセージが表示されないため、呼び出されないようです。

もう1つの奇妙な点は、ブルームーンになると機能し、次のような結果が得られることです。

07/08/2012 00:27:56.140 INFO ...Authenticator - Authenticator コンストラクター内

07/08/2012 00:27:56.171 INFO ...Authenticator - オーセンティケーターのユーザー名を取得しています

07/08/2012 00:27:56.171 INFO ...Authenticator - Authenticator コンストラクター内

07/08/2012 00:27:56.171 INFO ...Authenticator - Authenticator パスワードの取得

07/08/2012 00:27:56.171 INFO ...Authenticator - Authenticator コンストラクター内

07/08/2012 00:27:56.171 INFO ...Authenticator - オーセンティケーターのユーザー名を取得しています

07/08/2012 00:27:56.171 INFO ...Authenticator - Authenticator コンストラクター内

07/08/2012 00:27:56.171 INFO ...Authenticator - Authenticator パスワードの取得

07/08/2012 00:28:05.843 INFO ...Authenticator - Authenticator コンストラクター内

07/08/2012 00:28:05.843 INFO ...Authenticator - Authenticator コンストラクター内

07/08/2012 00:28:05.843 INFO ...Authenticator - Authenticator コンストラクター内

07/08/2012 00:28:05.843 INFO ...Authenticator - オーセンティケーターのユーザー名を取得しています

07/08/2012 00:28:05.843 INFO ...Authenticator - Authenticator コンストラクター内

07/08/2012 00:28:05.906 INFO ...Authenticator - Authenticator コンストラクター内

07/08/2012 00:28:05.906 INFO ...Authenticator - Authenticator パスワードの取得

07/08/2012 00:28:26.000 INFO ...Authenticator - Authenticator コンストラクター内

07/08/2012 00:28:26.000 INFO ...Authenticator - Authenticator コンストラクター内`

07/08/2012 00:28:26.000 INFO ...Authenticator - Authenticator コンストラクター内

07/08/2012 00:28:26.031 INFO ...Authenticator - Authenticator コンストラクター内 07/08/2012 00:28:26.031 INFO ...Authenticator - Authenticator パスワードの取得

それが機能するとき、コンストラクターを何度も呼び出す理由がわかりません。

マネージド (cdi) Bean は次のとおりです。

package com.mlb.mybills.view.user;

import com.mlb.mybills.i18n.Messages;
import java.util.Locale;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Named("authenticator")
@ViewScoped
public class Authenticator
{
    private static final Logger log = LoggerFactory.getLogger(Authenticator.class);

    private String username;
    private char[] password;

    public Authenticator()
    {
      log.info("in Authenticator constructor");
    }

    public String getUsername()
    {
      log.info("getting Authenticator username");
        return username;
    }

    public void setUsername(String username)
    {
      log.info("getting Authenticator username");
        this.username = username;
    }

    public char[] getPassword()
    {
      log.info("getting Authenticator password");
        return password;
    }

    public void setPassword(char[] password)
    {
        log.info("setting Authenticator password");
      this.password = password;
    }

public void setPassword(String password)
    {
        log.info("setting Authenticator password");
      this.password = password.toCharArray();
    }


   public String authenticate()
    {
      log.info("in Authenticator.authenticate");
        String result = null;
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
        try
        {
            request.login(username, new String(password));
            //result = "/private/group.xhtml?faces-redirect=true";
         result = "/group.xhtml?faces-redirect=true";
        }
        catch (ServletException ex)
        {
            log.error("Failed to authenticate user.", ex);
            Locale locale = FacesContext.getCurrentInstance().getViewRoot().getLocale();
         FacesMessage facesMessage = new FacesMessage(FacesMessage.SEVERITY_ERROR, Messages.getString(
                    "Login.InvalidIdPasswordMessage", locale), null);
            FacesContext.getCurrentInstance().addMessage(null, facesMessage);
        }
      log.info("result=" + result);
        return result;
    }

    public String logout()
    {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
        try
        {
            request.logout();
        }
        catch (ServletException servletEx)
        {
            log.warn("Failed to logout the user", servletEx);
        }
        return "/Login.xhtml?faces-redirect=true";
    }
}
4

3 に答える 3

1

CDI (@Named) アノテーションと JSF (@ViewScoped) アノテーションを混在させているため、少し問題があります。この大会のせいで何度も呼ばれているのだろう。Seam Faces や MyFaces CODI を調べたり、独自のバージョンの ViewScoped for CDI を展開したり、CDI をやめて JSF に直行したりできます。

于 2012-07-09T16:57:08.210 に答える
1

Bean 管理 API を混在させています。@Namedは CDI のものですが、は@ViewScopedJSF のものです。単一のバッキング Bean で両方ではなく、どちらか一方を使用する必要があります。#{authenticator}現在、Bean は基本的に有効なスコープなしで CDI によって管理されているため、EL 式が解決されるたびに Bean が構築されます。

この問題を解決するには、CDI に固執する場合は、@ConversationScoped代わりに@ViewScoped次を使用します。

@Named
@ConversationScoped

または、JSF に固執する場合は、@ManagedBean代わりに@Named次を使用します。

@ManagedBean
@ViewScoped

CDI アプローチの唯一の欠点は、プロパティとして を作成してから@InjectConversation自分で開始および終了する必要があることです。

于 2012-07-09T15:14:25.520 に答える
0

私はそれを理解していませんが、解決策を見つけました。次のリンクで見つけました: a link ! @RequestScoped と @Named を配置する代わりに、faces-config.xml に次のエントリも追加しました。

<managed-bean>
   <managed-bean-name>authenticator</managed-bean-name>
   <managed-bean-class>com.mlb.mybills.view.user.Authenticator</managed-bean-class>
   <managed-bean-scope>session</managed-bean-scope>
</managed-bean>

これで、ターゲット到達不能エラーが発生しなくなりました。

明らかに、BalusC によって指摘された上記のエラーも修正しました。ありがとうございます。

于 2012-07-22T23:51:24.520 に答える