Я написал обычай JsonDeserializer
который содержит autowired службы следующего образом:автоматического связывание в JsonDeserializer: SpringBeanAutowiringSupport против HandlerInstantiator
public class PersonDeserializer extends JsonDeserializer<Person> {
@Autowired
PersonService personService;
@Override
public Person deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
// deserialization occurs here which makes use of personService
return person;
}
}
Когда я впервые использовал этот десериализатор я получал неработающие, как personService не будучи autowired , От взгляда на другие ответы SO (в частности, this one) оказалось, что есть два способа заставить autowiring работать.
Вариант 1 является использование SpringBeanAutowiringSupport
в конструктор пользовательских десериализатор:
public PersonDeserializer() {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
Вариант 2 является использование HandlerInstantiator
и зарегистрировать его с моим ObjectMapper
боба:
@Component
public class SpringBeanHandlerInstantiator extends HandlerInstantiator {
@Autowired
private ApplicationContext applicationContext;
@Override
public JsonDeserializer<?> deserializerInstance(DeserializationConfig config, Annotated annotated, Class<? extends JsonDeserializer<?>> deserClass) {
try {
return (JsonDeserializer<?>) applicationContext.getBean(deserClass);
} catch (Exception e) {
// Return null and let the default behavior happen
return null;
}
}
}
@Configuration
public class JacksonConfiguration {
@Autowired
SpringBeanHandlerInstantiator springBeanHandlerInstantiator;
@Bean
public ObjectMapper objectMapper() {
Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean = new Jackson2ObjectMapperFactoryBean();
jackson2ObjectMapperFactoryBean.afterPropertiesSet();
ObjectMapper objectMapper = jackson2ObjectMapperFactoryBean.getObject();
// add the custom handler instantiator
objectMapper.setHandlerInstantiator(springBeanHandlerInstantiator);
return objectMapper;
}
}
Я попытался оба варианта, и они работают одинаково хорошо. Очевидно, что вариант 1 намного проще, так как это всего лишь три строки кода, но мой вопрос: есть ли недостатки в использовании SpringBeanAutowiringSupport
по сравнению с подходом HandlerInstantiator
? Мое приложение будет десериализовать сотни объектов в минуту, если это имеет значение.
Любые советы/отзывы приветствуются.
ли вам удалось найти какие-либо недостатки в отношении SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (это); ? –