spring - 如何在 Spring @RequestParam 中使用自定义反序列化器
问题描述
我有一个不知道其实现的接口(模块方面):
public interface SomeInterface {
}
和一个实现它的枚举:
public enum SomeInterfaceImpl {
}
我有一个@RestController
:
@RequestMapping(method = RequestMethod.GET)
public List<SomeClass> find(@RequestParam(value = "key", required = false) SomeInterface someInt,
HttpServletResponse response){
}
虽然杰克逊知道它应该反序列化SomeInterface
如下SomeInterfaceImpl
:
public class DefaultSomeInterfaceDeserializer extends JsonDeserializer<SomeInterface> {
@Override
public SomeInterface deserialize(JsonParser parser, DeserializationContext context) throws IOException {
return parser.readValuesAs(SomeInterfaceImpl.class).next();
}
}
和:
@Configuration
public class MyJacksonConfiguration implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if(bean instanceof Jackson2ObjectMapperBuilder){
Jackson2ObjectMapperBuilder builder = (Jackson2ObjectMapperBuilder) bean;
builder.deserializerByType(SomeInterface.class, new DefaultSomeInterfaceDeserializer());
}
return bean;
}
}
SomeInterface
并像SomeInterfaceImpl
中一样成功地序列化和反序列化@RequestBody
,它似乎对映射SomeInterface
到SomeInterfaceImpl
with没有任何影响@RequestParam
。我该如何克服呢?
解决方案
Converter
正如 M.Denium 建议的那样,在应用程序上下文中拥有一个可以完成这项工作:
@Component
public class SomeInterfaceConverter implements Converter<String, SomeInterface> {
@Override
public SomeInterface convert(String value) {
return new SomeInterfaceImpl(value);
}
}
推荐阅读
- reactjs - CDataTable (Core UI React) prop onPageChange 触发 2 次
- image - 网站更新清除所有客户端设备上的缓存,以便更新图像和内容
- r - 一个矩阵的行名和列名到另一个矩阵
- angular - 如何使用角度中的elementRef在一个分区中搜索选定的复选框
- javascript - React Material UI OutlinedInput 不显示错误信息
- mysql - 从当前行和上一行计算 2 列
- python - 如何使用赋值表达式和打字?
- docker - 在 Docker 映像上安装 SSH
- javascript - 如何将“日期”类型的输入值传递给每秒计算和更新年龄的函数
- java - 使用 Java PdfBox 合并多个 PDF(来自同一文件夹)文档