2016-08-05 2 views
7

Я занимаюсь разработкой приложения SpringBoot (например MyApp) с зависимостью к двум проектам данных с различной реализацией:SpringBoot: Может не Autowire класса из других библиотек Jar

данных jdbc.jar

  • построен с использованием spring-boot-starter-jdbc, которое обнажает класс JDBCDataService, который будет использоваться моим приложением

Пример кода :

@Service 
public class JDBCDataServiceImpl implements JDBCDataService { 

@Autowired 
private JDBCDataRepository jdbcDataRepository;  
... 
} 
  • с пакетом my.data.jdbc
  • нет SpringBoot основного класса. конфигурации Spring созданы только для модульного тестирования классов
  • классов хранилища использует JDBCTemplate

Sample Repository:

@Repository 
public class JDBCDataRepositoryImpl implements JDBCDataRepository { 

@Autowired 
protected JdbcTemplate jdbcTemplate; 
... 
} 

данные jpa.jar

  • построен используя spring-boot-starter-data-jpa, который также экспонирует эс класс JPADataService, который также будет использоваться моим приложением

Пример код:

@Service 
public class JPADataServiceImpl implements JPADataService { 

@Autowired 
private JPADataRepository jpaDataRepository;  
... 
} 
  • с пакетом my.data.jpa
  • нет SpringBoot основного класса. конфигурации Spring создается только для модульного тестирования классов
  • классов хранилища расширяет интерфейс CrudRepository

Sample Repository:

@Repository 
public interface JPADataRepository extends CrudRepository<MyObject, Integer{ 
... 
} 

В моем SpringBoot проекте, у меня есть следующий SpringBoot Основное применение:

@SpringBootApplication 
public class MyApp extends SpringBootServletInitializer { 
} 

В моем бизнесе обслуживается MainService класс, у меня есть следующая инъекция

@Service 
public class MainServiceImpl implements MainService { 

@Autowired 
private JDBCDataService jdbcDataService; 

@Autowired 
private JPADataService jpaDataService; 

Однако, я столкнулся с проблемой "Could not Autowire. No beans of 'JPADataService' type found", которая существует только для класса JPADataService, но работает отлично для JDBCService класса.

Я попробовал найденное решение в следующих вопросах, но ни один из них не работает в моем случае:

Can't I @Autowire a Bean which is present in a dependent Library Jar?

@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"}) 

How can I @Autowire a spring bean that was created from an external jar?

@Configuration 
@ComponentScan("com.package.where.my.class.is") 
class Config { 
... 
} 

Теперь я нашел решение по моей проблеме. Мне нужно повысить уровень моего первого уровня MyApp.java на одном уровне, чтобы сканировать мои библиотеки данных.

Вместо того, чтобы мой MyApp.java под my.app пакет, я должен переместить его под my для того, чтобы успешно сканировать свои библиотеки с my.data.jpa и my.data.jdbc пакетов.

+0

'@ ComponentScan' будет работать только в том случае, если класс' JPADataService' аннотируется с помощью '@ Component'. Вам нужно добавить аннотированный метод '@ Bean' в ваш класс' @ Configuration'. http://docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/creating-bean-definitions.html –

+0

@ Кристофер Шнайдер, оба класса обслуживания в обоих файлах jar фактически аннотируются с помощью ' @ 'обслуживания. AFAIK, '@ ComponentScan' должен также иметь возможность читать эти классы. – Jown

+0

@ Служба должна позаботиться об этом. Вы говорите, что у вас нет основного класса, так где же точка входа в приложение? –

ответ

1

Я нашел решение по моей проблеме. Мне нужно повысить уровень моего первого уровня MyApp.java на одном уровне, чтобы сканировать мои библиотеки данных.

Вместо того, чтобы мой MyApp.java под my.app пакет, я должен переместить его под my для того, чтобы успешно сканировать свои библиотеки с my.data.jpa и my.data.jdbc пакетов.

+0

это как мой выпуск тоже! благодаря! – walv

+0

Почему это произошло? Это ошибка или функция пружинной загрузки? – ajaristi

3

Добавление @ComponentScan не будет работать, если класс, который вы пытаетесь использовать Autowire, не аннотируется с @Component. Чтобы заставить это работать, вам нужно будет аннотировать метод в вашем классе @Configuration. Что-то вроде этого должно позволить вам автоупроверить класс:

@Configuration 
public class ConfigClass{ 

    @Bean 
    public JPADataService jpaDataService(){ 
     return new JPADataService(); 
    } 
} 
+0

Я должен добавить, что я не знаком с JPADataService. Для этого может потребоваться некоторая конфигурация, которую я не учитывал. –

+0

Если это так, оно также не должно работать в объекте 'JDBCService', поскольку я не объявлял этот класс в любом файле конфигурации Java в своем приложении, которое их использует. AFAIK, используя '@ SpringBootApplication', должен сделать для вас магию :-) – Jown

+0

Кто-нибудь знает, почему« @ComponentScan »не работает? Я столкнулся с той же проблемой, мой репозиторий даже аннотируется с помощью «@Repository» и добавлен компонент ComponentScan с базовым значением пакета, который является одним уровнем, где весна может видеть все бобы даже из библиотек jar. Приложение работало только тогда, когда я поднялся на один уровень с помощью SpringBootApplication, как сказал @Jown. – SHAKU

Смежные вопросы