Приложение Spring Boot не может внедрить Bean из другого модуля - PullRequest
0 голосов
/ 20 июня 2020

У меня есть следующие 3 модуля в моем приложении с весенней загрузкой:

  • web (точка входа / основной класс приложения, аннотированный @SpringBootApplication
  • постоянство
  • service

Сейчас я пытаюсь внедрить сервис в модуль web, который поступает из service. В сервисе я внедряю репозиторий, который поступает из persistence модуль. Когда я запускаю приложение, появляется следующая ошибка:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.project.service.images.ImageService required a bean of type 'com.project.persistence.repositories.ImageRepository' that could not be found.


Action:

Consider defining a bean of type 'com.project.persistence.repositories.ImageRepository' in your configuration.

ImageService класс:

package com.project.service.images;

import com.project.common.entities.Image;
import com.project.persistence.repositories.ImageRepository;
import com.project.service.AbstractService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.persistence.EntityNotFoundException;
import java.util.Date;
import java.util.List;

@Component
public class ImageService extends AbstractService {

    private final ImageRepository imageRepository;

    @Autowired
    public ImageService(ImageRepository imageRepository) {
        this.imageRepository = imageRepository;
    }

    public Image getImage(Long id) {
        return imageRepository.findById(id).orElseThrow(EntityNotFoundException::new);
    }

    public List<Image> getAll() {
        return imageRepository.findAll();
    }

    public List<Image> getAll(Date from) {
        return imageRepository.findByDateRange(from, null);
    }

    public List<Image> getAll(Date from, Date to) {
        return imageRepository.findByDateRange(from, to);
    }

    public List<Image> getAllForDay(Date day) {
        return imageRepository.findAll();
    }
}

ImageRepository класс:

package com.project.persistence.repositories;

import com.project.common.entities.Image;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

@Repository
public interface ImageRepository extends JpaRepository<Image, Long> {

    @Query("SELECT i FROM Image i WHERE i.created > :from AND i.created < :to")
    public List<Image> findByDateRange(@Param("from") Date from, @Param("to") Date to);
}

Вот как я внедряю службу в свой класс в модуле web:

@Autowired
private ImageService imageService;

Итак, я искал через inte rnet и увидел людей с похожими проблемами. Затем я получил подсказку что я должен добавить scanBasePackages к аннотации SpringBootApplication в моем классе приложения. Итак, я сделал это:

package com.project.web;

@SpringBootApplication(scanBasePackages = "com.project.service")
public class Application {

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

Но он все равно не работает. Если я добавлю специальный пакет c для сканирования к аннотации com.project.service.images инъекция ImageService работает, но затем не может найти * 10 37 * в нем.

Что я делаю не так?

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

Ответы [ 4 ]

1 голос
/ 20 июня 2020

Что обычно следует делать, это иметь эту структуру в вашем приложении

app
   SpringBootApp.java
   app.repositories
       Repository.java
   app.services
       Service.java

Если вы не следуете этой структуре пакета, тогда вам нужно иметь

@EnableJpaRepositories

И будьте осторожны для ваших организаций, у которых может быть такая же проблема, в этом случае взгляните на:

@EntityScan
1 голос
/ 20 июня 2020

Просто попробуйте изменить scanBasePackages на "com.project". Репозиторий находится в другом пакете.

например:

@SpringBootApplication(scanBasePackages = "com.project")

0 голосов
/ 20 июня 2020

Spring не может сканировать ваш класс репозитория, поскольку он находится в другом пакете.

Согласно вашему ответу в комментариях, ваш класс Application находится под

com.project. web

, поэтому по умолчанию Spring будет сканировать все классы в этих пакетах и ​​подпакетах. Поэтому вам нужно поместить все компоненты Spring в один пакет / подпакет, в котором находится ваше приложение.

0 голосов
/ 20 июня 2020

Создайте класс конфигурации и определите все ваши bean-компоненты в этом одном месте, в этом случае вам понадобится bean-компонент для ImageRepository, что-то вроде ...

@Configuration
@ComponentScan
public class Config {
    @Bean
    public ImageRepository getImageRepository() {
        // return the image repository object
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...