Spring 通用目标转换器

Spring Converters for generic targets

在路径变量和通用对象之间进行转换时,我遇到了 Spring 选择错误 Converter 的问题。如果我有两个转换器,我的第一个请求会选择正确的一个,但随后的请求会不断使用它。

所以在下面的例子中,无论我先点击哪个URL,都可以正常工作,但是无论我之后去哪个URL,都会使用初始转换器。

@Bean
public Converter<String, Optional<ThingOne>> ...

@Bean
public Converter<String, Optional<ThingTwo>> ...


@RequestMapping("/thingone/{thingOneId}")
public void (@PathVariable("thingOneId") @ModelAttribute("thing") Optional<ThingOne> thing) {
...

@RequestMapping("/thingtwo/{thingTwoId}")
public void (@PathVariable("thingTwoId") @ModelAttribute("thing") Optional<ThingTwo> thing) {
...

我尝试创建一个 ConditionalGenericConverter 以便我有机会检查已解析的类型,但它似乎做了同样的事情。一旦找到一个转换器,它就会缓存它以备将来使用,并且永远不会再次检查其他转换器。

所以我的问题是,我做错了吗?有没有比实现必须处理所有 String -> Optional 转换的 GenericConverter 更好的方法?

考虑为每个创建一个 TinyType。

public static class OptionalThingOne extends Optional<ThingOne>{}

public static class OptionalThingTwo extends Optional<ThingTwo>{}

您当然必须重新实现 Optional.of。或者您可以执行以下操作来避免这种情况...

public static class OptionalThingOne extends AtomicReference<Optional<ThingOne>>{}