Dan*_*lor 6 java jsf attributes custom-component jsf-2
我根据许多教程中的一个创建了我的自定义JSF组件(我使用的是PrimeFaces),我添加了一个成功传递给组件的参数.
<c:custom command="command"/>
Run Code Online (Sandbox Code Playgroud)
public void setCommand(String command) {
log.debug("setCommand {}", command);
this.command = command;
}
Run Code Online (Sandbox Code Playgroud)
但我需要自定义类型的参数,这是我在教程中找不到的,它只处理最琐碎的情况.
<c:custom image="#{currentImageBean.image}"/>
Run Code Online (Sandbox Code Playgroud)
public void setImage(Object image) {
log.debug("setImage {}", image);
this.image = (Image) image;
}
Run Code Online (Sandbox Code Playgroud)
bean返回Image类型的对象,但不调用setter.我希望这会有效,因为否则一个好的教程应该提到这种情况,但现在我遇到了更糟糕的错误:没有任何反应,日志中没有任何内容暗示为什么......那么,出了什么问题,我需要改变什么,在哪里寻找潜在的错误?
这与自定义类型无关.这与使用文字(静态)值与EL如做attributename="attributevalue"对比attributename="#{attribute.value}".
此行为是预期的并且符合规范.作为EL表达式的属性值ValueExpression由设置UIComponent#setValueExpression().它们应该仅在真正被请求时才被评估,通常在视图渲染时间期间.在烘焙实例期间不应直接评估它们,UIComponent因为这会破坏动态值表达式的性质(考虑取决于当前迭代轮数据表).
更好的方法是委托可以保存EL值表达式的属性的getter/setter UIComponent#getStateHelper()而不是本地属性.该setValueExpression()会即最终也是在结束了StateHelper.这UIComponent#getAttributes()也解决了来自的价值观StateHelper.
public Image getImage() {
return (Image) getStateHelper().eval("image");
}
public void setImage(Image image) {
getStateHelper().put("image", image);
}
Run Code Online (Sandbox Code Playgroud)
请注意,没有本地财产.因此,当您需要属性的(已评估)值时,只需调用getter即可.
为了实现初始功能需求(即set属性的日志记录),您可能希望将日志记录语句添加到setValueExpression()委派给的覆盖中super.
@Override
public void setValueExpression(String name, ValueExpression binding) {
log.debug(....);
super.setValueExpression(name, binding);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1963 次 |
| 最近记录: |