【发布时间】:2016-03-18 13:19:54
【问题描述】:
我的问题是:
出于兼容性原因,我的一些实体字段需要具有准确的长度。该长度通过@Size(min=10, max=10) 或字段上的类似名称定义。尽管这些字段被键入为字符串,但它们实际上包含数字。大多数字段的值都带有前导零,例如:0000148233。
现在我不想强迫用户在输入字段中输入前导零。应该可以只输入148233。
我的第一种方法是编写一个复合组件,它使用一个简单的 FacesConverter 根据属性 length 在输入上添加前导零:
<composite:interface>
<composite:attribute name="value" required="true" />
<composite:attribute name="length" required="true"
type="java.lang.Integer" />
</composite:interface>
<composite:implementation>
<h:inputText value="#{cc.attrs.value}">
<f:converter converterId="leadingZeroesConverter" />
<f:attribute name="length" value="#{cc.attrs.length}" />
</h:inputText>
</composite:implementation>
我在 Converter 中读取了length 属性:
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
int length = (Integer) component.getAttributes().get("length");
return Strings.zeroPrefixFillUp(value, length);
}
这确实很好用,但我实际上不想在 JSF 中定义长度。
我想做的是以某种方式访问注释,无论是在 JSF 中还是在转换器中。这样我可以避免在两个地方维护该属性。
在转换器中,我有 FacesContext 和 UIComponent(显然是 InputText)。有什么方法可以获取字段的名称(以及它的类),以便我可以访问该注释?
PS:为了让您知道,为了清楚起见,我从 Converter 中删除了所有错误处理。
【问题讨论】:
-
@BalusC:我不认为这是重复的。这里要求的是能够使用转换器中的长度来自动添加前导零......
-
@Kukeltje:谢谢,这个链接让我走上了正轨。查看我的答案以查看可行的解决方案。任何进一步的建议表示赞赏。
标签: jsf reflection annotations