Pisałem zwyczaj JsonDeserializer
który zawiera autowired usługi, jak następuje:autowiring w JsonDeserializer: SpringBeanAutowiringSupport vs 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;
}
}
Kiedy po raz pierwszy skorzystał z tej Deserializatora byłem coraz NPEs jak personService nie był autowired . Patrząc na inne odpowiedzi SO (w szczególności this one), wydaje się, że istnieją dwa sposoby uzyskania pracy autowirowania.
Wariant 1 jest użycie SpringBeanAutowiringSupport
wewnątrz konstruktora niestandardowej Deserializatora:
public PersonDeserializer() {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
opcja 2 jest użycie HandlerInstantiator
i zarejestrować go z moim ObjectMapper
Fasola:
@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;
}
}
próbowałem obie opcje i działają równie dobrze. Oczywiście opcja 1 jest znacznie łatwiejsza, ponieważ jest tylko trzema liniami kodu, ale moje pytanie brzmi: czy są jakieś wady korzystania z SpringBeanAutowiringSupport
w porównaniu z podejściem HandlerInstantiator
? Moja aplikacja będzie deserializować setki obiektów na minutę, jeśli to robi jakąkolwiek różnicę.
Każda rada/opinia jest doceniana.
Czy udało się znaleźć żadnego wadę przed SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this); ? –