gpt4 book ai didi

java - 定义多个具有目标类型的 Spring 转换器 可选?

转载 作者:行者123 更新时间:2023-12-02 11:29:17 26 4
gpt4 key购买 nike

我正在使用 Spring Boot 1.5.10,并且我的自定义转换器存在问题。

我正在定义多个目标类型可选的转换器像这样的事情:

@Component
public class StringToSomeTypeConverter implements Converter<String, Optional<SomeType>> { ... }


@Component
public class StringToOtherTypeConverter implements Converter<String, Optional<OtherType>> { ... }

我的问题是显然只有一个为可选类型注册的转换器。因此,在运行时,我的所有 Controller 中仅调用一个转换器。无论通用目标类型如何。 (示例中为 SomeTypeOtherType)

我做了一些挖掘,并在 GenericConversionService#getConverter 中选择了转换器。 。该方法需要 TypeDescriptor targetType作为参数并构造一个 ConverterCacheKey来自sourceTypetargetType 。可悲的是TypeDescriptor#equals仅比较 getType() (可选)而不是 resolvableType (在我们的示例中为 SomeTypeOtherType)。这解释了为什么只选择一个转换器。

有什么方法可以让 Spring 意识到 ResolvableType所以我可以使用Optional作为多个转换器的目标类型?

最佳答案

我无法确定发生了什么,但多次浏览 Spring MVC 源代码后,我猜问题出在某些迭代注册转换器并检查它们是否可以转换的代码中,因此目标类型将是可选的(不是Optional >,而是Optional),如果运行以下代码:

Optional<Class<String>> ops = Optional.of(String.class);
Optional<Class<Integer>> ops2 = Optional.of(Integer.class);
System.out.println(ops2.getClass().equals(ops.getClass()));

你会在控制台上看到,它打印 true,意思是,它们被认为是相同的数据类型!因此,如果 Spring 真正遍历转换器列表,则始终调用第一个转换器是有意义的,因为无论如何它都可以处理所有可选对象,我的建议是:

更新:如果您有兴趣在 Spring 框架中进行调试,则必须在 ConversionService 接口(interface)的方法上放置断点,它是管理转换的服务,至少这是它在 Spring Core 中的工作方式,并且您将应该看到执行流程,并在某个时刻检查哪个转换器是合适的,如果其中一些转换器实现了 ConditionalConverter,请亲自查看此过程的核心方法之一:https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java#L560

关于java - 定义多个具有目标类型的 Spring 转换器 可选?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49390639/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com