Вложенная авто проводка с дженериками весной - PullRequest
1 голос
/ 23 сентября 2019

Насколько я понимаю, с весны 4 года и далее универсальный тип может служить действительным классификатором.Это прекрасно работает в следующем (базовом) примере:

public interface TypeResolver<T>{
   Class<T> type();
}
@Configuration
public TypeResolversConfig{

   @Bean
   public TypeResolver<Integer> integerTypeResolver(){
      return () -> Integer.class
   }

   @Bean
   public TypeResolver<String> stringTypeResolver(){
      return () -> String.class
   }
}
@Service
public class SomeService{

   @Autowired
   private TypeResolver<Integer> integerTypeResolver;
}

Однако, если я добавлю еще один компонент:

@Service
public class SomeOtherService<T>{

   @Autowired
   private TypeResolver<T> tTypeResolver;

}

, а затем приступим к редактированиюSomeService следующим образом:

@Service
public class SomeService{

   @Autowired
   private SomeOtherService<Integer> someOtherService;
}

Я получаю

Поле tTypeResolver в com.example.demo.SomeOtherService требуется один компонент, но найдено 2

исключение.Есть ли способ обойти это, или это просто внутреннее ограничение, при котором пружина может обойти стирание типа только в ограниченной степени?Я использую весеннюю загрузку 2.1.8. ВЫПУСК.

1 Ответ

0 голосов
/ 23 сентября 2019

Обобщения не присутствуют во время компиляции, поэтому универсальный тип Autowiring имеет меньшее значение.Таким образом, вы можете достичь этого следующим образом

@Service
public class SomeService{

   @Autowired
   private TypeResolver<Integer> integerTypeResolver;

   @Autowired
   private TypeResolver<String> stringTypeResolver;

   ...
}

НЕТ необходимости SomeOtherService.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...