Бин не найден с помощью @SpringBootApplication - PullRequest
0 голосов
/ 06 ноября 2018

У меня проблема с микросервисами в JAVA. Я не понимаю, почему мой код не хочет компилироваться.

Я следую обучающему видео (на французском языке), чтобы создать простой проект для знакомства с микросервисами.

Я создаю контроллер, дао и модель. Когда я компилирую контроллер для доступа к 127.0.0.1.1порту / продуктам, он должен вернуть мне список продуктов, которые я определил в коде, НО при компиляции, он показывает мне, что у меня когда-то была рука:

"Ошибка: метод main не найден в классе

"в то время как обычно для запуска проекта мне не нужно сдавать, потому что он должен просто сказать мне" Хорошо, вы можете перейти на 127.0.0.1/Port "(порт определен в приложении. Свойства и не заняты)

Вот архитектура моего проекта:

введите описание изображения здесь

Вот код моего контроллера, который я хочу скомпилировать:

package com.ecommerce.microcommerce.controller;

import com.ecommerce.microcommerce.dao.ProductDao;
import com.ecommerce.microcommerce.model.Product;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class ProductController {

    @Autowired
    private ProductDao productDao;

    //Produits
    @GetMapping(value = "Produits")
    public List<Product> listeProduits() {
        return productDao.finAll();
    }

    //Produits/{id}
    @GetMapping(value = "Produits/{id}")
    public Product afficherUnProduit(@PathVariable int id) {
        Product product = new Product(1, new String("aspirateur"), 100);
        return product;
    }

}

Мои файлы из моего DAO:

package com.ecommerce.microcommerce.dao;

import com.ecommerce.microcommerce.model.Product;
import java.util.List;

public interface ProductDao {

    public List<Product> finAll();

    public Product finById(int id);

    public Product save(Product product);

}

package com.ecommerce.microcommerce.dao;

import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.ecommerce.microcommerce.model.Product;

@Repository 
public class ProductDaoImpl implements ProductDao {

    public static List<Product> products = new ArrayList<>();

    static {
        products.add(new Product(1, new String("Ordinateur portable"), 350));
        products.add(new Product(2, new String("Aspirateur robot"), 500));
        products.add(new Product(3, new String("Table de ping pong"), 750));

    }

    @Override
    public List<Product> finAll() {
        return products;
    }
    @Override
    public Product finById(int id) {
        return null;
    }
    @Override
    public Product save(Product product) {
        return null;
    }
}

Мои файлы из моей модели:

package com.ecommerce.microcommerce.model;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MicrocommerceApplication {

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

package com.ecommerce.microcommerce.model;

public class Product {

    private int id;
    private String name;
    private int prix;

    public Product(int id, String name, int prix) {
        this.id = id;
        this.name = name;
        this.prix = prix;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrix() {
        return prix;
    }

    public void setPrix(int prix) {
        this.prix = prix;
    }

    @Override
    public String toString() {
        return "Product [id=" + id + ", name=" + name + ", prix=" + prix + "]";
    }

}

Я видел, что у многих людей была проблема с компиляцией в другом посте, но нет ответа на мою проблему

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

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Поскольку ваш MicrocommerceApplication (основной класс) класс и другие Бины , такие как ProductDaoImpl и ProductController, находятся в разных пакетах, Spring не может их обнаружить.

@ SpringBootApplication = @Configuration + @ComponentScan + @ EnableAutoConfiguration

Аннотация @SpringBootApplication эквивалентна использованию @Configuration, @EnableAutoConfiguration и @ComponentScan с их атрибутами по умолчанию: [...]

По умолчанию используется @ ComponentScan , который ищет только bean-компоненты в текущем пакете .

Если вы хотите пользовательскую конфигурацию, укажите свои @Configuration, @EnableAutoConfiguration и @ComponentScan, в зависимости от ситуации.

Решения вашей проблемы:

  1. Вы можете использовать хак для перемещения MicrocommerceApplication и всех других Бобов внутри одной упаковки .

  2. Вместо @SpringBootApplication вы можете использовать:

    package com.ecommerce.microcommerce.model;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @Configuration
    @EnableAutoConfiguration
    @ComponentScan({
                     "com.ecommerce.microcommerce.controller",
                     "com.ecommerce.microcommerce.dao"
                     "com.ecommerce.microcommerce.model"})
    public class MicrocommerceApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MicrocommerceApplication.class, args);
        }
    }
    
0 голосов
/ 05 декабря 2018

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

@Component
public class ApplicationRunner implements CommandLineRunner {

        @Autowired
        private ProductController productController;

        @Override
        public void run() {
            //TODO
        }
    }

Я надеюсь, что это работает!

0 голосов
/ 06 ноября 2018

Попробуйте переместить класс MicrocommerceApplication в пакет

com.ecommerce.microcommerce

Еще одна вещь, адрес по умолчанию - ваш localhost (127.0.0.1).

...