ich eine benutzerdefinierte JsonDeserializer
geschrieben haben, die einen autowired Dienst enthält, wie folgt:autowiring in 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;
}
}
Als ich zum ersten Verwendung dieses Deserializer machte ich wurde NPE als personService immer nicht autowired werden . Aus der Betrachtung anderer SO-Antworten (insbesondere this one) ergibt sich, dass es zwei Möglichkeiten gibt, das Autowiren zum Laufen zu bringen.
Option 1 ist SpringBeanAutowiringSupport
im Konstruktor des benutzerdefinierten Deserializer zu verwenden:
public PersonDeserializer() {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
Option 2 ist ein HandlerInstantiator
zu verwenden und registriert es mit meiner ObjectMapper
Bohne:
@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;
}
}
ich versucht habe, beide Optionen und sie funktionieren gleich gut. Natürlich ist Option 1 viel einfacher, da es nur drei Zeilen Code ist, aber meine Frage ist: Gibt es Nachteile bei der Verwendung von SpringBeanAutowiringSupport
im Vergleich zu HandlerInstantiator
Ansatz? Meine Anwendung wird Hunderte von Objekten pro Minute deserialisieren, wenn das irgendeinen Unterschied macht.
Jede Beratung/Feedback ist willkommen.
Haben Sie es geschafft, jeden Nachteil gegen SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (diese) zu finden; ? –