1

ログインが休止状態を介してデータベース(postgresql)に保存されるjsf 2.1のアプリケーションがあります。私のアプリケーションはSpringで作成され、Spring Securityを使用して正常にログインできます:

<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="customUserDetailsService">
        <password-encoder ref="passwordEncoder" />
    </authentication-provider>
</authentication-manager>

問題は、アプリケーションにログインしているユーザーに関する情報を表示したい場合です。jsf では、EL (式言語) を介して名前を表示できます。

#{request.userPrincipal.name}

しかし、データベース内の他の情報ストアを表示したいので、休止状態の方法を使用します:

public Users getUser(String login) {
    List<Users> userList = new ArrayList<Users>();  
    Query query = openSession().createQuery("from Users u where u.login = :login");  
    query.setParameter("login", login);  
    userList = query.list();  
    if (userList.size() > 0)  
        return userList.get(0);  
    else
        return null;
}

そして、私はこのshowUserのようにjsf Beanを介してこれを呼び出します:

 @Component
 @Scope("session")
 public class UsersBean {
private String login;
private String name_user;
private String pass;
private HabilitacionVehicular_InscripcionFacade habilitacionVehicular_InscripcionFacade;

public String getLogin() {
    return login;
}
public void setLogin(String login) {
    this.login = login;
}
public String getName_user() {
    return name_user;
}
public void setName_user(String name_user) {
    this.name_user = name_user;
}
public String getPass() {
    return pass;
}
public void setPass(String pass) {
    this.pass = pass;
}
public Users showUser(String login) throws DataAccessException, EntityNotFoundException{
    return habilitacionVehicular_InscripcionFacade.getUser(login);
}

しかし、私はそれをアプリケーションに表示することはできません

 <h:dataTable value="#{usersBean.showvUser()}" var="c"
        styleClass="order-table" headerClass="order-table-header"
        rowClasses="order-table-odd-row,order-table-even-row">

        <h:column>
            <f:facet name="header">
                Customer ID
            </f:facet>
                #{c.login}
        </h:column>

これは私にエラーを与えます:

 Error: /WEB-INF/flows/main/main.xhtml @24,58 value="#{usersBean.showvUser()}": Method showvUser not found

そして、これはELとメソッドを組み合わせると:

 Error: /WEB-INF/flows/main/main.xhtml @24,58 value="#{usersBean.showvUser(#{request.userPrincipal.name})}" Failed to parse the expression [#{usersBean.showvUser(#{request.userPrincipal.name})}]
4

3 に答える 3

3

メソッドの署名は

public Users showUser(String login)

ただし、呼び出します

#{usersBean.showvUser()} 

のような方法がない場合userBean#showUser()

( #{} )次に、パラメーターをアクション メソッドに渡す場合、2 番目の el リゾルバーを使用する必要はありません。使用する

#{usersBean.showvUser(request.userPrincipal.name)
于 2013-09-11T05:41:33.787 に答える
1

Spring セキュリティは現在ログインしているユーザーの詳細をセキュリティ コンテキストに保持するため、ユーザーの詳細に対して追加のクエリを実行する必要はありません。必要なことは、EL を介してその情報にアクセスできるようにすることだけです。たとえば、次のゲッターをバッキング Bean に配置します。

public MyUser getCurrentUser() {
    return (MyUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}

UserDetailsS​​ervice は のインスタンスを返しますMyUser

ところで、それもオブジェクトで#{requst.userPrincipal}はないですか? MyUserそうであれば、#{requst.userPrincipal.anotherProperty}代わりに(UserDetailsS​​erviceが「anotherProperty」という名前のプロパティを持つオブジェクトを返す場所)を単に使用できます...

于 2013-09-19T07:40:43.560 に答える