我想将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
注入到ObjectMapper
ala 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实现这一点的建议都将不胜感激。
解决此问题的一种方法是创建@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);