为什么JSF形成保留值?

时间:2013-09-02 19:28:16

标签: jsf-2 jsf-2.2

这是我的登录页面的支持bean。为什么在调用logIn()方法后它会保留值?我的意思是在我提交表单并返回登录页面后,我之前输入的用户名已经存在。我认为通过使用@RequestScoped注释,不会保留值。

@Controller
@ManagedBean
@RequestScoped
public class LogInBean implements Serializable {

    private static final long serialVersionUID = 2092611147930386873L;

    @Autowired
    private UserService userService;
    private String username;
    private String password;
    private boolean rememberMe;

    public String logIn() {
        return "index?faces-redirect=true";
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isRememberMe() {
        return rememberMe;
    }

    public void setRememberMe(boolean rememberMe) {
        this.rememberMe = rememberMe;
    }

}

1 个答案:

答案 0 :(得分:1)

这是因为你实际使用应用程序范围的Spring托管bean而不是请求范围的JSF托管bean。

您的主要错误是您正在将JSF bean管理注释与Spring bean管理注释混合在一起,并且不知何故期望它们能够无缝地相互理解。

@Controller
@ManagedBean
@RequestScoped

因此不是这样。您最终会有两个完全独立的托管bean实例,一个由JSF管理,另一个由Spring管理。 @RequestScoped注释特定于JSF bean管理工具。 Spring的等价物@Scope("request")不存在,因此Spring托管bean默认为应用程序范围。当像EL #{logInBean}那样引用EL作用域中的bean时,由于Spring bean EL解析器,Spring管理的bean优先于JSF托管的bean,你最终得到了一个应用程序作用域的Spring托管bean。这完全解释了症状。

通过删除JSF bean管理注释并放置所需的Spring作用域注释来相应地修复它:

@Controller
@Scope("request")

(另一种方法是摆脱Spring bean管理注释并用@Autowired替换@EJB,就像在没有任何第三方库的情况下使用标准Java EE堆栈时一样)

如果仍然面临此问题,那么另一个可能的原因是您在输入字段中没有autocomplete="off"的情况下同步提交登录信息,请转到此Q& A那么:Disable web browser password save