1

我在 jsf 2.1 中有一个应用程序,其中登录通过休眠存储在数据库(postgresql)中,我的应用程序是在 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;
}

我通过 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()

( #{} )其次,如果您将参数传递给操作方法,则无需使用第二个 el 解析器。利用

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

无需对用户的详细信息运行额外的查询,因为 Spring Security 将当前登录用户的详细信息保存在安全上下文中。您需要做的就是使这些信息可以通过 EL 访问,例如通过将以下 getter 放入支持 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 回答
0

您无法使用此方法获取数据,因为您正在尝试从数据库加载数据表。因此,在加载页面时使用其他一些技术示例,只需调用数据表填充的加载方法并将列表与数据表绑定即可。在您的方法中,您只是向服务器发送了一些参数,但是当 JSF 页面运行时,它没有找到任何不接受参数的方法,因此会引发错误。因此,您只需使用 jsf:param 或其他方式发送一些参数并尝试加载数据表。希望这会对您有所帮助

或者你试试这个

{usersBean.showUser(#{usersBean.name_user})}

问候

于 2013-09-11T06:08:21.237 回答