Зависимость @Autowired в конвертере десериализатора Джексона с Spring Boot 2.1.0 равна нулю - PullRequest
0 голосов
/ 11 января 2019

Я хочу автоматически связать пружинную зависимость в преобразователь десериализации Джексона. Например,

 import com.fasterxml.jackson.databind.util.StdConverter;

 @Component
 public class LookupConverter extends StdConverter<T, T> {

    @Autowired
    private Repository<T> repo;

    @Override
    public IsoCountry convert(T value) {
        repo.findById(value.getId()).orElse(value);
    }
}

Я пытался использовать: SpringBeanAutowiringSupport например,

public LookupConverter() {
    SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}

но получите следующее сообщение

Текущий WebApplicationContext недоступен для обработки LookupConverter: убедитесь, что этот класс создан в веб-приложении Spring. Продолжение без инъекции.

Я пытался ввести SpringHandlerInstantiator в ObjectMapper ала , это и , это

@Bean
public HandlerInstantiator handlerInstantiator(ApplicationContext applicationContext) {
    return new SpringHandlerInstantiator(applicationContext.getAutowireCapableBeanFactory());
}

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder(HandlerInstantiator handlerInstantiator) {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
    builder.handlerInstantiator(handlerInstantiator);
    return builder;
}

Это также не работает, по-видимому, потому что SpringHandlerInstantiator не используется и мой пользовательский Converter не создается экземпляром весной.

Будем весьма благодарны за любые указания на то, как это можно сделать с помощью Spring Boot 2.1.0.

1 Ответ

0 голосов
/ 15 января 2019

Один из способов обойти эту проблему - создать @Service, который предоставляет хранилище или хранилища статическим способом, например:

@Service
public class RepositoryService {

    @Resource
    private ExampleEntityRepository repo;

    @Getter
    private static final Map<Class<?>, Repository<?, ?>> repos = new HashMap<>();

    @PostConstruct
    private void postConstruct() {
        repos.put(ExampleEntity.class, repo);
    }

}

Тогда вместо того, чтобы вводить репо в конвертер, вы сделаете что-то вроде:

private Repository<ExampleEntity, Long> repo = RepositoryService.getRepos()
                                                       .get(ExampleEntity.class);
...