Spring Boot не может сканировать аннотации с помощью нескольких модулей - PullRequest
0 голосов
/ 02 ноября 2019

Я использую весеннюю загрузку и дизайн несколькими модулями. Ниже структура моего проекта:

Ядро магазина модулей: Имя пакета: com.baotrung.core.business Я проектирую некоторый подпакет: модель, репозитории, сервисы

Maven:

<modelVersion>4.0.0</modelVersion>

    <artifactId>shop-core</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <!-- shop-core-model !-->
        <dependency>
            <groupId>com.baotrung</groupId>
            <artifactId>shop-core-model</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>


    </dependencies>

CategoryService

 public interface CategoryService {

    List<Object> countProductsByCategories(MerchantStore store, List<Long> categoryIds);

    List<Category> listByStoreAndParent(MerchantStore store, Category category);

    PersistableCategory saveCategories(MerchantStore store, PersistableCategory persistableCategory);

    Category findById(Long id);

    List<ReadableCategory> findCategories(MerchantStore store, int dept, Language language,List<String> filters);

}

Категории Сервис Impl

@Service
public class CategoryServiceImpl implements CategoryService {

    @Autowired
    private CategoriesRepository categoryRepository;

    @Autowired
    private LanguageRepository languageRepository;

    @Autowired
    private Mapper<Category,ReadableCategory> categoryReadableCategoryMapper;

    //some method

@ Репозиторий

public interface CategoriesRepository extends CrudRepository<Category, Long>, CategoryRepositoryCustom {

 }

public interface CategoryRepositoryCustom {

    List<Object> countProductsByCategories(MerchantStore store, List<Long> categoryIds);

    List<Category> listByStoreAndParent(MerchantStore store, Category category);


    }

@Repository
public class CategoryRepositoryCustomImpl implements CategoryRepositoryCustom {

// some method impl
}

Я также создаю модуль shopping-ap p и использовал shop-code зависимость вЭто. Выглядит как:

Maven:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>spring-shopping-project</artifactId>
        <groupId>com.baotrung</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>shopping-app</artifactId>

    <dependencies>
        <dependency>
            <groupId>com.baotrung</groupId>
            <artifactId>shop-core-model</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.baotrung</groupId>
            <artifactId>shop-core</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

и в модуле shopping-app я создаю пакет com.baotrung.web и создаю несколькосубпакет: хранилище , сервисы , модель ... и создание приложения с именем Application.class выглядит так:

@SpringBootApplication(scanBasePackages = {"com.baotrung.core.business","com.baotrung.*"})
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

Но когда я загружаюсь Application.class это вызывает у меня исключение

Field categoryRepository in com.baotrung.core.business.services.CategoryServiceImpl required a bean of type 'com.baotrung.core.business.repositories.CategoriesRepository' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'com.baotrung.core.business.repositories.CategoriesRepository' in your configuration.

Я не могу понять почему, потому что я добавил аннотацию в CategoriesRepository с @ хранилищем , как указано выше в модуле com.baotrung.core.business.repositories.CategoriesRepository . Почему весна не может найти меня боб из com.baotrung.core.business.repositories , потому что это действительно определить. Пожалуйста, помогите мне?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

Я бы порекомендовал вам очистить / реструктурировать иерархию пакетов, чтобы она работала. Он должен работать без каких-либо дополнительных аннотаций, проверьте мой github, где я создал тест для вашего данного примера: https://github.com/fabapp/stackoverflow58672323

Если вы поместите свой класс Application в корневой пакет вашего приложения, например, com.baotrung.shop,Сканирование компонента начнется с этого пакета вниз. Все остальные компоненты должны находиться в этом или в подпакетах, и все будет проще, и вам потребуется меньше стандартного кода. Помещение класса Application в параллельный пакет (и ниже) для других ваших компонентов (как вы это сделали) заставит вас указать путь для сканирования компонентов, чтобы найти эти (и будущие) компоненты, которые не работали должным образом.

0 голосов
/ 02 ноября 2019

Обновите это, добавив @EnableJpaRepositories и @EntityScan:

@SpringBootApplication
@EntityScan(basePackages = {"com.baotrung.*"})
@EnableJpaRepositories(basePackages = {"com.baotrung.*"})
public class Application extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...