JSF 列表转换器

2023-12-14

如何为 JSF2 中的 A 类项目列表编写转换器?我已经为 A 类编写了一个转换器,但这些项目使用默认的 toString() 函数显示:“A@hashcode”。

我需要使用转换器而不是支持 bean 方法,以便可以进行验证(Hibernate Validator)。

更多信息

这就是我使用列表的方式:

<h:inputText id="destinations" value="#{rule.destinations}" converter="gr.panayk.vinyls.Destination"/>

其中 #{rule.destinations} 是List<Destination>类型。我期待一个以逗号分隔的已转换目的地列表。

solution

我附上 BalusC 提出的列表转换器。

@FacesConverter(value="gr.panayk.vinyls.converter.DestinationList")
public class DestinationListConverter implements Converter
{
    @Override
    public Object getAsObject(final FacesContext context, final UIComponent component, final String values)
    {
        final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

        final List<Destination> result = new ArrayList<Destination>(); 
        for (String value : values.split(",", -1))
        {           
            final String trimmedValue = value.trim();

            final Set<ConstraintViolation<Destination>> violations = validator.validateValue(Destination.class, "data", trimmedValue);
            if (!violations.isEmpty())
            {
                throw new ConverterException(new FacesMessage(violations.iterator().next().getMessage()));
            }

            result.add(new Destination(trimmedValue));
        }       

        final Set<ConstraintViolation<Rule>> violations = validator.validateValue(Rule.class, "destinations", result);
        if (!violations.isEmpty())
        {
            throw new ConverterException(new FacesMessage(violations.iterator().next().getMessage()));
        }       

        return result;
    }

    @Override
    public String getAsString(final FacesContext context, final UIComponent component, final Object value)
    {
        if (value instanceof List<?>)
        {
            final StringBuffer result = new StringBuffer();

            final List<?> list = (List<?>) value;

            for (int i = 0; i < list.size()-1; i++)
            {               
                if (list.get(i) instanceof Destination)
                {
                    result.append(((Destination) list.get(i)).getData());
                    result.append(", ");
                }
                else
                {
                    throw new IllegalArgumentException( "Cannot convert " + value + " object to Destination in DestinationConverter." );
                }
            }

            if (!list.isEmpty())
            {
                if (list.get(list.size()-1) instanceof Destination)
                {
                    result.append(((Destination) list.get(list.size()-1)).getData());
                }
                else
                {
                    throw new IllegalArgumentException( "Cannot convert " + value + " object to Destination in DestinationConverter." );
                }
            }

            return result.toString();
        }
        else
        {
            throw new IllegalArgumentException( "Cannot convert " + value + " object to List in DestinationConverter." );
        }
    }
}

我已经为 A 类编写了一个转换器,但这些项目使用默认的 toString() 函数显示:“A@hashcode”。

如果您没有在组件上显式声明转换器,则可能会发生这种情况。例如在<h:selectManyCheckbox> and <h:selectManyListbox>显式声明转换器是强制性的,因为所有 JSF/EL 都知道该值是类型List, not List<A>(泛型类型在运行时会丢失)。如果您不声明转换器,则这些值将被视为String(因为这就是 HTML 输出和 HTTP 请求参数值的默认值)。

E.g.

<h:selectManyCheckbox converter="aConverter">

with

@FacesConverter(value="aConverter", forClass=A.class)
public class AConverter implements Converter {

    // ...

}

当您使用单项输入(如<h:selectOneMenu> as the forClass无论如何都会匹配它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSF 列表转换器 的相关文章

  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • 添加动态数量的监听器(Spring JMS)

    我需要添加多个侦听器 如中所述application properties文件 就像下面这样 InTopics Sample QUT4 Sample T05 Sample T01 Sample JT7 注意 这个数字可以多一些 也可以少一些
  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 无法使用maven编译java项目

    我正在尝试在 java 16 0 1 上使用 maven 构建 IntelliJ 项目 但它无法编译我的项目 尽管 IntelliJ 能够成功完成 在此之前 我使用maven编译了一个java 15项目 但我决定将所有内容更新到16 0 1
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • eclipse中导入项目文件夹图标

    我在 Eclipse 工作区中新导入的 Maven 项目有J and M项目文件夹顶部的图标 项目和包资源管理器 而其他导入的 Maven 项目只有一个J icon 有人可以解释其中的区别吗 该项目有J装饰器被称为 Java 项目和具有M装
  • 如何在 JSP 中导入类?

    我是一个完全的JSP初学者 我正在尝试使用java util List在 JSP 页面中 我需要做什么才能使用除以下类之外的类java lang 使用以下导入语句进行导入java util List 顺便说一句 要导入多个类 请使用以下格式
  • Condition 接口中的 signalAll 与对象中的 notificationAll

    1 昨天我才问过这个问题条件与等待通知机制 https stackoverflow com questions 10395571 condition vs wait notify mechanism 2 我想编辑相同的内容并在我的问题中添加
  • 如果使用的 JVM 是 x86 或 x64,则以不同的方式解决 Maven 依赖关系?

    我设置了一个 Maven 存储库来托管一些 dll 但我需要我的 Maven 项目根据使用的 JVM 是 x86 还是 x64 下载不同的 dll 例如 在运行 x86 版本 JVM 的计算机上 我需要从存储库下载 ABC dll 作为依赖
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 获取给定类文件的目录路径

    我遇到的代码尝试从类本身的 class 文件所在的同一目录中读取一些配置文件 File configFiles new File this getClass getResource getPath listFiles new Filenam
  • Espresso 和 Proguard 的 Java.lang.NoClassDefFoundError

    我对 Espresso 不太有经验 但我终于成功地运行了它 我有一个应用程序需要通过 Proguard 缩小才能处于 56K 方法之下 该应用程序以 3 秒的动画开始 因此我需要等到该动画结束才能继续 这就是我尝试用该方法做的事情waitF
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 如何在 Quartz 调度程序中每 25 秒运行一次?

    我正在使用 Java 的 Quartz Scheduling API 你能帮我使用 cron 表达式每 25 秒运行一次吗 这只是一个延迟 它不必总是从第 0 秒开始 例如 序列如下 0 00 0 25 0 50 1 15 1 40 2 0
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • JSON 到 hashmap (杰克逊)

    我想将 JSON 转换为 HashMapJackson http jackson codehaus org 这是我的 JSON String json Opleidingen name Bijz trajecten zorg en welz
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • 启动Java项目时发生类冲突:ClassMetadataReadingVisitor将接口org.springframework.asm.ClassVisitor作为超类

    我正在使用最新的Spring框架版本 3 2 2 RELEASE 开发一个Java Web项目 但是现在项目启动时遇到了问题 详细错误是 java lang IncompleteClassChangeError 类 org springfr

随机推荐

  • 如何在 Cloudformation 中使用嵌套列表或附加到列表?

    我想为该资源提供 2 个存在于堆栈外部的安全组 加上一个作为堆栈一部分创建的安全组 我已尝试以下操作并收到错误 SecurityGroups 属性的值必须是字符串列表类型 SecurityGroups FindInMap envMap Re
  • window.innerWidth 无法在 IE7 上工作。如何通过 JS 和 jQuery 修复?

    我想获取浏览器窗口的宽度 如果存在滚动条 它应该包含滚动条的宽度 如何通过JS解决这个问题 如何通过 jQuery 解决这个问题 谢谢你 网络上散布着许多这样的例子 这是一个常见问题 这是我在快速搜索中找到的内容 var winW 630
  • 将带有空格的文件行作为列表读取到 NetLogo 中

    如何将由空格分隔的文件内容作为列表读入 NetLogo 例如 对于包含以下数据的文件 2321 23233 2 2321 3223 2 2321 313 1 213 321 1 我想创建如下列表 a 2321 2321 2321 213 b
  • 将 unicode 转换为实际字符 C# [重复]

    这个问题在这里已经有答案了 我有一个字符串 我正在使用一些字符串 但 Poacher u2019s 显示 unicode 我正在尝试将 Unicode 转换为 字符 类似的东西应该有效 string text Some string tha
  • 如何在 Nuxt 配置中为 vue 中的深色模式添加渐变

    所以基本上这是我的 nuxt config js 的一部分 我想通过来回切换变成不同的颜色 请帮忙 基本上 当我附加渐变类时 它没有按预期工作 theme dark true themes dark primary colors blue
  • Android 2.0 添加联系人号码

    我正在尝试将电话号码添加到 Droid 手机上现有的联系人中 在创建联系人的同时执行此操作很简单 因为在创建 ContentProviderOperation 时我提供的反向引用只是 0 但是尝试通过查询显示名称来查找反向引用是行不通的 C
  • 获取当前歌曲的插图时出错

    抓取当前歌曲的专辑封面并用它来更改某个歌曲imageView image生成错误 但不再崩溃 以前是这样 因为我遗漏了if artwork 错误处理 呃 这个方法 void handleNowPlayingItemChanged id no
  • 将带单引号的动态值作为 ng-true-value 表达式传递失败

    我的复选框输入根据变量动态设置 true 值trueVal 这是一个字符串
  • Java 日期和时间

    我有一个传递 java util Date 的应用程序 我想检查这个日期是否在一天中的指定时间 例如 10 30 和 11 30 之间 我不关心日期 只关心一天中的时间 谁能告诉我一个简单的方法来做到这一点 Thanks 这就是Calend
  • 我正在尝试从 firebase 获取下载网址,但它给了我另一个链接,例如“com.google.android.gms.tasks.zzu@b9761c8”[重复]

    这个问题在这里已经有答案了 我正在尝试获取下载网址firebase但它给了我另一个链接 例如 com google android gms tasks zzu b9761c8 检索 url 时需要添加监听器 请阅读文档 taskSnapsh
  • Python Pandas 转换列数据类型

    我知道这样的问题已经被问了无数种 但到目前为止我还没有找到这个问题的答案 我已将两个 csv 文件与 Pandas 一起加入 现在我想向新加入的 csv 文件添加更多列 并根据已有的可用数据计算值 但是 我不断收到此错误 The truth
  • Karate API:将变量传递到其他功能文件不起作用

    我从传递 url 用户名和密码的其他功能文件中调用登录功能文件 但它对我不起作用 我在这里没有使用背景键 我也不想使用 CallAnotherFeature Feature Call Login Feature Scenario Calli
  • Kendo UI 捆绑包在 IIS 中不起作用

    我正在使用 Kendo UI 在 ASP NET MVC 4 中开发一个应用程序 整个应用程序通过运行 Visual Studio 2012 可以完美运行 但是当发布到 Kendo 的 IIS 包时不起作用 导致整个界面处于未配置状态 下面
  • 如何查看事件处理程序被添加到元素中?

    我有一个错误 看起来像是由附加了单击事件的事件处理程序引起的 mxpnl track links pagebody a Click body 我想看看如何添加该元素的事件处理程序 以及何时 我在 Chrome 调试器 开发工具 gt 元素中
  • 在 CSS 中创建渐变线

    问题 如果我想创建在顶部和底部淡出的渐变线 类似于 AT T 下拉菜单中分隔菜单项的线条 我该怎么做 我想在我正在编码的菜单上创建类似的效果 并且我不想使用图像 有没有办法在 CSS 中实现这一点 非常感谢帮助 谢谢 微软CSS渐变是您可以
  • 如何使用 VB.NET 从具有 IDENTITY-H 字体的 PDF 文件中提取文本

    我有一个 PDF 文件 我正在使用 iTextSharp 类以编程方式从 PDF 文件中读取文本 它确实读取 Ansi 编码文本 但不读取 IDENTITY H 编码文本 我的问题是如何使用 VB Net 从 pdf 文件中读取 IDENT
  • php preg_match 和 ereg 语法差异

    我发现语法是preg match 和已弃用的ereg 是不同的 例如 我以为 preg match div div content 意思是一样的 ereg div div content 但是我错了 preg match 不包含特殊字符 如
  • 如何将utf8字符串转换为[]byte?

    我想解组string包含 JSON 但是 那Unmarshal函数需要一个 byte作为输入 如何转换我的 UTF8string to byte 这个问题可能是重复的如何将字符串分配给字节数组 但仍然回答它 因为有更好的替代解决方案 转换自
  • Visual Studio 2015 xsl调试转换失败WebException SocketException

    在 VS 2015 中调试 xslt 时 出现以下错误消息 xsl 转换失败 请参阅输出窗口了解详细信息 WebException 无法连接到远程服务器 SocketException 无法建立连接 因为目标计算机主动拒绝它 127 0 0
  • JSF 列表转换器

    如何为 JSF2 中的 A 类项目列表编写转换器 我已经为 A 类编写了一个转换器 但这些项目使用默认的 toString 函数显示 A hashcode 我需要使用转换器而不是支持 bean 方法 以便可以进行验证 Hibernate V