【发布时间】:2015-11-03 16:20:03
【问题描述】:
实现:org.glassfish 2.2.12
我有以下会话范围的验证器:
@ManagedBean
@SessionScoped
public class CreateGroupNameValidator extends LengthValidator implements Serializable{
@ManagedProperty(value="#{myDao}")
private MyDao myDao;
//Validate methods
}
尽管是会话范围和Serializable,但验证器在回发时无法恢复属性myDao 的值。我使用调试器并发现状态由 StateHolderSaver 类保存,该类具有以下构造函数:
public StateHolderSaver(FacesContext context, Object toSave) {
className = toSave.getClass().getName();
if (toSave instanceof StateHolder) {
// do not save an attached object that is marked transient.
if (!((StateHolder) toSave).isTransient()) {
Serializable [] tuple = new Serializable[StateHolderTupleIndices.LastMember.ordinal()];
tuple[StateHolderTupleIndices.StateHolderSaverInstance.ordinal()] =
(Serializable) ((StateHolder) toSave).saveState(context);
if (toSave instanceof UIComponent) {
tuple[StateHolderTupleIndices.ComponentAddedDynamically.ordinal()] = ((UIComponent)toSave).getAttributes().containsKey(DYNAMIC_COMPONENT) ? Boolean.TRUE : Boolean.FALSE;
}
savedState = tuple;
} else {
className = null;
}
} else if (toSave instanceof Serializable) {
savedState = (Serializable) toSave;
className = null;
}
}
所以,由于 LenghtValidator 实现了 javax.faces.component.StateHolder 它并没有保存我的初始 Dao 值。这是正常行为吗?
【问题讨论】:
-
什么是
MyDao?该名称暗示它是一个服务类或 EJB,如果是这种情况,则不能使用@ManagedProperty注入(并且需要像@EJB、@Inject或@Autowired这样的注释)。真正的验证器(或转换器)通常只能具有两个范围中的任何一个,请求范围(@FacesValidator)或应用程序范围。其余的范围没有多大意义。 -
@Tiny 这是一颗春豆。