当前位置: 首页 > 面试题库 >

JSF定制组件:支持定制类型的参数,永远不会调用属性设置器

阮梓
2023-03-14
问题内容

我已经根据许多教程之一创建了自定义 JSF 组件(我正在使用 PrimeFaces ),并添加了一个参数,该参数已成功传递给组件

<c:custom command="command"/>



public void setCommand(String command) {
    log.debug("setCommand {}", command);
    this.command = command;
}

但是我需要自定义类型的参数,而这是我在教程中找不到的,它们只处理最简单的情况。

<c:custom image="#{currentImageBean.image}"/>



public void setImage(Object image) {
    log.debug("setImage {}", image);
    this.image = (Image) image;
}

Bean返回类型为 Image
的对象,但未调用setter。我期望这会起作用,因为否则,一个好的教程应该提到这种情况,但是现在我陷入了更严重的错误:什么也没有发生,并且日志中也没有任何东西提示为什么…所以,怎么了?
,我需要更改什么,在哪里寻找潜在的错误?


问题答案:

这与自定义类型无关。这与使用文字(静态)值和EL以及attributename="attributevalue"ins有关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);
}

请注意,没有本地属性。因此,当您需要属性的(求值)值时,只需调用getter。

为了实现您的初始功能需求(即set属性的日志记录),您可能希望将logging语句添加到setValueExpression()委托给的重写中super

@Override
public void setValueExpression(String name, ValueExpression binding) {
    log.debug(....);
    super.setValueExpression(name, binding);
}


 类似资料:
  • 问题内容: 我正在尝试编写一个渲染器,该渲染器将处理组件上的属性。在阅读了JSF2.0并去除了必需的HTML5属性之后,我走了这条路,这似乎是正确的。这是我的自定义渲染器 并且此渲染器在faces config中注册为 这被注册罚款,那里没有问题。 我的意图是处理该属性,将其插入,然后将处理委托给super。我上面的代码不起作用,因为我在错误的位置插入了属性。必须在执行后将其插入。但是,start

  • 我有以下控制器代码: 问题:在Swagger中为SpecificController生成open api标记时,响应中的客户端模型是BaseClientModel,而不是SpecificClientModel,并且只有id字段,而没有id名称。 实际: 预期: 如果我有40个特定的控制器,有没有办法让springdoc开放api根据特定的通用参数生成正确的标记?

  • 我想在每次加载页面时向服务人员发送一条消息。 第一次加载页面时,它调用寄存器(),然后侦听navigator.serviceWorker上的“控制器更改”事件,但这永远不会触发。 我如何知道何时可以开始发送邮件给服务人员?

  • 问题内容: 我正在尝试实现自定义Spring存储库。我有界面: 实现: 和“主”存储库,扩展了我的自定义存储库: 根据文档,我正在使用Spring Boot : 运行我的应用程序时,出现以下错误: 问题答案: 这里的问题是你正在创建,但正在中使用它。你需要进行创建才能完成这项工作。 阅读此文档以获取更多详细信息 基本上 Spring Data 2.x更新 此答案是为Spring 1.x编写的。正如

  • 问题内容: 看过很多论坛,但没有找到答案…简单的东西,用@PostLoad注释的方法永远不会被调用…通过@EntityListeners添加了侦听器,但问题仍然存在。我正在使用基于SessionFactory的配置。 问题答案: 当使用基于基础的配置时,EJB3 注释不起作用,后期加载方法将永远不会被调用。 使用Hibernate的Interceptor或事件或基于基本的配置。

  • 问题内容: 我似乎无法弄清楚我的代码出了什么问题,但是我不断得到: 这是我的代码: 当我在查询中将’ ‘而不是设置为变量时,它可以正常工作,因此我知道这是元组语法或其他问题。我已经试过了,没有括号,有第二个变量,有没有单独定义的游标,基本上我能想到的每种方法,我已经研究了数小时,但是却一无所获,所以任何帮助都是超级有用的赞赏。 问题答案: 嵌套列表,元组用于,而不用于。 传递包含参数的平面列表(或