带有参数的JSF 2中的自定义转换器

use*_*784 14 jsf converter jsf-2

我正在尝试实现一个自定义截断转换器,它会截断给定索引处的字符串并添加一个连续符号.只有当我对参数进行硬编码时,转换器才能正常工作,因为它们没有传递给后端.我究竟做错了什么?

参数是转换器类的属性:

@FacesConverter(value = TruncateConverter.CONVERTER_ID)
public class TruncateConverter implements Converter, StateHolder
{
    public static final String CONVERTER_ID = "bla.blablabla.Truncate";

    private int truncateIndex;
    private String contSymbol;
Run Code Online (Sandbox Code Playgroud)

这是我如何使用转换器(或尝试):

<h:outputText id="news-text-left" value="#{newsListBean.newsList_teaser.text}">
    <f:converter converterId="bla.blablabla.Truncate" truncateIndex="150" contSymbol="..." />
</h:outputText>
Run Code Online (Sandbox Code Playgroud)

我google了很多,并没有找到一个带参数的JSF2转换器的例子......谢谢你们的帮助,真的很感激!

Mak*_*aks 24

您可以查看JSF2.0源代码.例如DateTimeConverter ... JSF源代码可以在svn reposotory中找到:https://svn.java.net/svn/mojarra~svn/trunk

IMO创建这样的转换器并不容易.它还需要创建转换器标签以注册转换器.

将一些数据传递给转换器的其他方法是attibutes.所以你可以写

<h:outputText ...>
  <f:converter converterId="bla.blablabla.Truncate" />
  <f:attribute name="truncateIndex" value="150"/>
</h:outputText>
Run Code Online (Sandbox Code Playgroud)

比调用component.getAttributes().get("truncateIndex"); 转换器代码.

  • 你能否注意到f:属性不应该在转换器块内,它应该是<f:outputText> <f:converter /> <f:attribute />然后结束输出文本.该属性绑定到组件ID,而不是转换器本身. (3认同)

lef*_*loh 5

基于@Maks解决方案:可以将转换器和属性组合在一个标签中:

<facelet-taglib version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
    <namespace>http://mycompany.com/some-identifier</namespace>
    <tag>
        <tag-name>truncate</tag-name>
        <converter>
            <converter-id>bla.blablabla.Truncate</converter-id>
        </converter>
        <attribute>
            <name>truncateIndex</name>
        </attribute>
    </tag>
</facelet-taglib>
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用转换器:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:my="http://mycompany.com/some-identifier">

  <my:truncate truncateIndex="150" />

</ui:composition>
Run Code Online (Sandbox Code Playgroud)

您也不需要从组件属性中获取参数。具有相同名称的 bean-property 将自动填充:

@FacesConverter("bla.blablabla.Truncate")
public class Truncate implements Converter {

    private String truncateIndex;

    // getters + setters

    ...

}
Run Code Online (Sandbox Code Playgroud)