我想将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 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如何完成此操作的指针将不胜感激。
答案 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);