在与 Tapestry 5 的战斗中,我创建了一些不起作用的设置,我不知道为什么。我找到了一些解决方法,但我仍然想知道为什么最初的想法失败了。
我有具有应用程序范围的身份验证过程的父抽象页面类:
public abstract class AuthPage {
@SessionState
protected UserAuth user;
public Object onActivate(){
if(user==null)
return LoginForm.class;
else if(user.getLoggedIn().equals(Boolean.FALSE))
return LoginForm.class;
else
return null;
}
}
然后我有索引页面类,使用 auth 类作为 aprent:
public class Index extends AuthPage
{
}
这部分工作顺利 - 当用户 SSO 被初始化时,我得到了索引内容,否则它进入 LoginForm。现在有问题的部分——索引使用了一个布局组件,它负责显示个性化的标题和菜单。它的逻辑是这样的:
public class Layout extends AuthPage
{
@Property
private Boolean loggedIn;
@Property
private String userName;
@SetupRender
public boolean checkNames(){
if(user==null){
loggedIn = false;
userName = "unlogged";
}
else if(user.getLoggedIn().equals(Boolean.FALSE)){
loggedIn=false;
userName = "unlogged";
}
else{
loggedIn = true;
userName = this.user.getUsername();
}
return true;
}
}
这个想法很简单 - 来自 AuthPage 的会话对象用户应该在 Layout 中可用,并在 setup-render 阶段使用以获取用户名并为渲染菜单等升旗。从我的角度来看,一切都应该工作,但实际上是 Layout 类没有从会话中获取用户对象(尽管它肯定已初始化,因为 Index 呈现其内容)。
所以我的问题是 - 为什么 Layout 类看不到存储在会话中的 UserAuth 对象,而是将其设置为 null 呢?
** * ** * ** * ***小更新:
我已将布局重构为该形状:
public class Layout
{
@SessionState
protected UserAuth user;
@Property
private Boolean loggedIn;
@Property
private String userName;
@SetupRender
public boolean checkNames(){
if(user==null){
loggedIn = false;
userName = "unlogged";
}
else if(user.getLoggedIn().equals(Boolean.FALSE)){
loggedIn=false;
userName = "unlogged";
}
else{
loggedIn = true;
userName = this.user.getUsername();
}
return true;
}
}
它可以按我的意愿工作 - 布局(从索引页面作为组件执行)从会话中获取用户属性,执行 checkNames 并正确设置所有属性。对我来说,初始实现和第二个实现之间没有技术差异,但不知何故,当用户在父类中定义时,总是设置为 null(无论会话中存储了什么)。问题是——为什么它会这样工作?