【问题标题】:Get managed bean and type bound to "value" attribute获取托管 bean 和类型绑定到“值”属性
【发布时间】:2020-05-06 06:02:04
【问题描述】:

假设我有以下结构:

1) 托管 Bean:

@ViewScoped
@ManagedBean
public class TestBean {
    private Test test;

    //getters/setters
}

2) 测试类:

public class Test {
    private String attribute;

    //gets/sets
}

3) XHTML

<p:inputText id="test" value="#{testBean.test.atribute}" />

现在,我知道有一种方法可以找到并获取组件实例:

UIComponent c = view.findComponent(s);

从 UIComponent 中,如何获取绑定到组件的类型?

我需要的是从组件中设置为“值”属性的内容中获取完整的限定类名。类似于:package.Test.attribute.

【问题讨论】:

  • 既然 ui 知道它是来自 primefaces 的 InputText,你不能简单地做 InputText c = ((InputText) view.findComponent(s)).getValue().getClass()?
  • 您好@MárioFernandes,谢谢您的回答。我按照你的建议做了,但它抛出 java.lang.ClassCastException: javax.faces.component.UINamingContainer cannot be cast to org.primefaces.component.inputtext.InputText
  • 我假设您找到了不正确的组件。由于 p:inputText 不是 UINamingContainer。您是否传递了完整的 ID(可能需要预先设置表单 ID)
  • 是的,我正在使用 PrimeFace 的 ComponentUtils.findComponentClientId 实用方法。我猜它返回的是复合而不是 inputText 但它没有意义,因为复合没有 ID。
  • 我看到findComponentClientId使用了一个方法firstWithId,请问你在dom中有相同id的吗? (不一样,因为它是不允许的,但至少开始相同)

标签: jsf


【解决方案1】:

UIComponent 提供getValueExpression("attributeName")

样本:

  UIViewRoot viewRoot = Faces.getViewRoot();
            UIComponent component= viewRoot.findComponent("x");
            ValueExpression value = component.getValueExpression("value");
            Class<?> expectedType = value.getType(Faces.getELContext());

注意:Faces 这里来自Omnifaces,它是“JSF API 的实用方法集合,主要是从线程本地 FacesContext 获取内容的快捷方式。”

getType() javadoc 除外

public abstract Class getType(ELContext context) 评估 相对于提供的上下文的表达式,并返回最 可以作为对象传递的通用类型 将来调用 setValue(javax.el.E​​LContext.java.lang.Object) 方法时的 value 参数。这并不总是相同的 getValue().getClass()。例如,在一个表达式的情况下 引用一个数组元素,getType 方法将返回 数组的元素类型,它可能是类型的超类 当前在指定数组元素中的实际元素。

对于MethodExpression,请阅读此内容。

【讨论】:

  • 这意味着用户必须拥有全脸:/
  • 不,答案的第一部分是plain jsf
  • 确实如此:)
  • 首先感谢大家的支持。使用 Ominifaces 没有问题,因为我已经将它用于其他事情。我做了@Kukeltje 所说的,但它只返回最后一个属性的类型,这是预期的行为,但我需要的是更深层次的东西,我的意思是,我需要实体类型而不是唯一的属性。例如,如果我的“值”声明是“testBean.test.attribute”,我试图获取包含“test.attribute”的类的完整限定名,在这种情况下:package.Test.attribute。
  • 我正在寻找一种方法来做到这一点的原因是因为我正在开发一种高级访问控制机制。其中,基于绑定到组件的 bean+attr,它会检查数据库是否对其有任何约束,例如:它是只读的、隐藏的或可由特定角色访问等。我知道有更简单的方法来这样做,但我希望更自动化,开发人员不需要担心任何额外的声明来满足这个要求。
猜你喜欢
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 2013-12-23
  • 2011-03-07
  • 2017-02-21
相关资源
最近更新 更多