【发布时间】:2011-12-06 00:02:43
【问题描述】:
我在 Spring 3 应用程序中注册了自定义转换服务。它适用于 POJO,但不适用于列表。
例如,我从String 转换为Role 并且它工作正常,但不适用于List<String> 到List<Role>。
尝试注入列表时,所有类型的ClassCastExceptions 都会在应用程序中飞来飞去,无论它们包含什么。转换服务为所有人调用 List<String> 到 List<Role> 的转换器。
如果您考虑一下,这是有道理的。类型擦除是这里的罪魁祸首,转换服务实际上看到 List 到 List。
有没有办法告诉转换服务使用泛型?
我还有什么其他选择?
【问题讨论】:
-
如果您在运行时遇到 ClassCastExceptions,则问题不在于泛型,而在于您的代码。泛型仅用于编译器。泛型应该在这里可用。你能展示一下这个转换方法的代码吗?
-
@andypandy:在 Spring 中,我可以使用 Converter 接口注册转换器。由于这是通用的,因此最简洁的代码使用以下实现
Converter<List<String>, List<Role>>。当然,由于类型擦除,这不起作用。但问题不在于代码,而是 Spring 在运行时将转换器应用于所有列表,即使是那些不包含字符串或角色的列表。 -
现在我明白了 - 认为这是您自己的服务/服务处理。听起来您只能注册一个列表转换器,该转换器又应该包装并转发到您选择的列表转换器。虽然不是 Spring Converter 功能方面的专家。
-
@andypandy:是的,这是我想到的一种解决方法,但我真的不喜欢
instanceof测试或在元素上匹配类名来确定类型。我在网上搜索了高低,但找不到列表的东西。在采取一些解决方法之前,我认为 SO 社区可以帮助我解决我可能错过的一些问题。 -
我上次对 spring 转换实现进行了非常深入的研究。如果您有一个从字符串转换为角色的转换器,它应该可以工作(对于 List
到 List ,您不需要额外的转换器)但我也发现了一个非常奇怪的行为(可能是一个错误) 如果您从 List转换为List,转换器将不起作用。但是,如果您从List转换为Set,它会起作用! -- 如果您能确认相同的行为,我将再次查看代码,并可能会提出罚单。
标签: java spring type-conversion spring-3