使用Spring Boot 2.1.0的杰克逊解串器转换器中的@Autowired依赖关系为null

时间:2019-01-11 15:32:33

标签: java spring-boot jackson autowired

我想将spring依赖项自动连接到杰克逊反序列化转换器中。例如,

 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注入ObjectMapper ala thisthis

@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 个答案:

答案 0 :(得分:0)

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