【发布时间】:2020-02-26 10:40:07
【问题描述】:
我有一个不知道其实现的接口(模块方面):
public interface SomeInterface {
}
和一个实现它的枚举:
public enum SomeInterfaceImpl {
}
我有一个@RestController:
@RequestMapping(method = RequestMethod.GET)
public List<SomeClass> find(@RequestParam(value = "key", required = false) SomeInterface someInt,
HttpServletResponse response){
}
虽然 Jackson 知道它应该将 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 序列化和反序列化为@RequestBody 中的SomeInterfaceImpl,它似乎对使用@RequestParam 映射SomeInterface 到SomeInterfaceImpl 没有任何影响。我该如何克服这个问题?
【问题讨论】:
-
转换请求参数不使用jackson(为什么不是json)。您需要一个自定义的
Converter来将String转换为您的实现。
标签: spring spring-boot spring-restcontroller http-request-parameters