我发现了一些尝试使用view参数设置值的奇怪行为。下面的代码不起作用...在使用view参数提交表单时,未设置id值。但是,如果从getId和setId方法中删除注释,则正确设置id值。在访问泛型时,JSF EL是否存在一些问题,或者我做了一些非常错误的事情?任何人都可以解释这种行为吗?
有趣的是,我没有收到任何例外......价值根本没有设定。实际上,抽象类中的setId方法甚至都没有被调用。
public abstract class AbstractBusinessObjectAction<E, ID extends Serializable> {
protected abstract BusinessObjectManager<E, ID> getBusinessObjectManager();
public ID getId() {
ID id = getBusinessObjectManager().getId();
return id;
}
public void setId(final ID id) {
getBusinessObjectManager().setId(id);
}
}
@Named("configuration")
@ConversationScoped
public class ConfigurationAction extends AbstractBusinessObjectAction<ConfigurationParameter, Long> {
@Inject
private ConfigurationParameterManager manager;
protected BusinessObjectManager<ConfigurationParameter, Long> getBusinessObjectManager() {
return manager;
}
// public Long getId() {
// Long id = super.getId();
// return id;
// }
// public void setId(Long id) {
// super.setId(id);
// }
}
以下是除.xhtml以外的内容:
<f:metadata>
<f:viewParam id="entityIdParam" name="entityId" value="#{configuration.id}" />
</f:metadata>
答案 0 :(得分:0)
添加转换器解决了这个问题。
<f:viewParam id="entityIdParam" name="entityId" value="#{configuration.id}" >
<f:converter converterId="javax.faces.Long" />
</f:viewParam>
据我所知,这就是原因:
因为抽象类中的id属性类型为ID extends Serializable
,所以JSF尝试安装不存在的Serializable转换器。当我取消注释所指示的方法时,代码工作的原因是JSF正确地检测到它需要基于{id}属性的属性方法的javax.faces.Long
的显式声明的Long
转换器。
感谢@Damian提示!