提问者:小点点

使用Spring Boot 2.1.0的jackson反序列化器转换器中的@Autow了依赖项为空


我想将Spring依赖项自动连接到jackson反序列化转换器中。例如,

 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 Web应用程序中构造此类。不注入继续。

我已经尝试将SpringHandlerInstantiator注入到ObjectMapperala this和this中

@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实例化。

任何关于如何使用Spring Boot 2.1.0实现这一点的建议都将不胜感激。


共1个答案

匿名用户

解决此问题的一种方法是创建@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);
    }

}

然后,您可以执行以下操作,而不是将repo注入转换器:

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