У меня есть интерфейс, который не знает о его реализациях (по модулю):
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
с @RequestParam
. Как мне это преодолеть?