Spring DI для репозитория (JAVA) - PullRequest
0 голосов
/ 01 декабря 2018

Я делаю тестовое приложение Spring Controller -> Сервис -> Репозиторий

Контроллер->

@RestController
public class HelloController {


@Autowired
private ProductServiceImpl productService;

    @RequestMapping("/getAll")
    public List getAll(){
        return productService.getAll();
    }
}

Сервис ->

@Service
public class ProductServiceImpl implements Services.ProductService {

    @Autowired
    private ProductRepository productRepository;


    @Override
    public List<Product> getAll() {
        return productRepository.findAll();
   }
}

Репозиторий ->

@Repository
public interface ProductRepository extends JpaRepository<Product,Long> {
}

Приложение ->

@SpringBootApplication
@EnableJpaRepositories("Repository")
@ComponentScan("com.lopamoko")
public class CloudliquidApplication {

    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(CloudliquidApplication.class, args);

        String[] beanNames = ctx.getBeanDefinitionNames();
        Arrays.sort(beanNames);
        for (String beanName : beanNames) {
            System.out.println(beanName);
        }
    }

Я пытаюсь сделать в контроллере @Autowired private ProductServiceImpl productServiceImpl;- Он клянется, что для этого нет бобов.- Я делаю в Application Bean - он начинает ругаться, что теперь не может найти Bean для ProductRepository (Interface) - когда я вызываю его из Сервиса.Как сделать компонент для интерфейса?

1 Ответ

0 голосов
/ 01 декабря 2018

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

Если ProductRepository находится в пределах «com.lopamoko», вы можете оставить значение пустым.

@SpringBootApplication
@EnableJpaRepositories
@ComponentScan("com.lopamoko")
public class CloudliquidApplication {

public static void main(String[] args) {
    ApplicationContext ctx = SpringApplication.run(CloudliquidApplication.class, args);

    String[] beanNames = ctx.getBeanDefinitionNames();
    Arrays.sort(beanNames);
    for (String beanName : beanNames) {
        System.out.println(beanName);
    }
}

Поскольку вы уже указали пакет для сканирования внутри @ComponentScan("com.lopamoko")

Если ваш репозиторий находится в другом пакете, вам нужно указать пакет в качестве значения @EnableJpaRepositories

@SpringBootApplication
@EnableJpaRepositories("com.repository")
@ComponentScan("com.lopamoko")
public class CloudliquidApplication {

public static void main(String[] args) {
    ApplicationContext ctx = SpringApplication.run(CloudliquidApplication.class, args);

    String[] beanNames = ctx.getBeanDefinitionNames();
    Arrays.sort(beanNames);
    for (String beanName : beanNames) {
        System.out.println(beanName);
    }
}

Не забудьте также аннотировать объект Product с помощью аннотации JPA @Entity

...