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>>{}
在路径变量和通用对象之间进行转换时,我遇到了 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>>{}