简体   繁体   English

考虑在配置中定义类型为'com.ensat.services.ProductService'的bean

[英]Consider defining a bean of type 'com.ensat.services.ProductService' in your configuration

I have 我有

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@ComponentScan(basePackages = {"hello","com.ensat.controllers"})
@EntityScan("com.ensat.entities")
public class Application extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Application.class);
    }

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

}

ProductController.java ProductController.java

package com.ensat.controllers;

import com.ensat.entities.Product;
import com.ensat.services.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Product controller.
 */
@Controller
public class ProductController {

    private ProductService productService;

    @Autowired
    public void setProductService(ProductService productService) {
        this.productService = productService;
    }

    /**
     * List all products.
     *
     * @param model
     * @return
     */
    @RequestMapping(value = "/products", method = RequestMethod.GET)
    public String list(Model model) {
        model.addAttribute("products", productService.listAllProducts());
        System.out.println("Returning rpoducts:");
        return "products";
    }

    /**
     * View a specific product by its id.
     *
     * @param id
     * @param model
     * @return
     */
    @RequestMapping("product/{id}")
    public String showProduct(@PathVariable Integer id, Model model) {
        model.addAttribute("product", productService.getProductById(id));
        return "productshow";
    }

    // Afficher le formulaire de modification du Product
    @RequestMapping("product/edit/{id}")
    public String edit(@PathVariable Integer id, Model model) {
        model.addAttribute("product", productService.getProductById(id));
        return "productform";
    }

    /**
     * New product.
     *
     * @param model
     * @return
     */
    @RequestMapping("product/new")
    public String newProduct(Model model) {
        model.addAttribute("product", new Product());
        return "productform";
    }

    /**
     * Save product to database.
     *
     * @param product
     * @return
     */
    @RequestMapping(value = "product", method = RequestMethod.POST)
    public String saveProduct(Product product) {
        productService.saveProduct(product);
        return "redirect:/product/" + product.getId();
    }

    /**
     * Delete product by its id.
     *
     * @param id
     * @return
     */
    @RequestMapping("product/delete/{id}")
    public String delete(@PathVariable Integer id) {
        productService.deleteProduct(id);
        return "redirect:/products";
    }

}

ProductService.java ProductService.java

package com.ensat.services;

import com.ensat.entities.Product;

public interface ProductService {

    Iterable<Product> listAllProducts();

    Product getProductById(Integer id);

    Product saveProduct(Product product);

    void deleteProduct(Integer id);

}

ProductServiceImpl.java ProductServiceImpl.java

package com.ensat.services;

import com.ensat.entities.Product;
import com.ensat.repositories.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * Product service implement.
 */
@Service
public class ProductServiceImpl implements ProductService {

    private ProductRepository productRepository;

    @Autowired
    public void setProductRepository(ProductRepository productRepository) {
        this.productRepository = productRepository;
    }

    @Override
    public Iterable<Product> listAllProducts() {
        return productRepository.findAll();
    }

    @Override
    public Product getProductById(Integer id) {
        return productRepository.findOne(id);
    }

    @Override
    public Product saveProduct(Product product) {
        return productRepository.save(product);
    }

    @Override
    public void deleteProduct(Integer id) {
        productRepository.delete(id);
    }

}

This is my error: 这是我的错误:

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

Description:

Parameter 0 of method setProductService in com.ensat.controllers.ProductController required a bean of type 'com.ensat.services.ProductService' that could not be found.


Action:

Consider defining a bean of type 'com.ensat.services.ProductService' in your configuration.

I have full log: https://gist.github.com/donhuvy/b918e20eeeb7cbe3c4be4167d066f7fd 我有完整的日志: https//gist.github.com/donhuvy/b918e20eeeb7cbe3c4be4167d066f7fd

This is my full source code https://github.com/donhuvy/accounting/commit/319bf6bc47997ff996308c890eba81a6fa7f1a93 这是我的完整源代码https://github.com/donhuvy/accounting/commit/319bf6bc47997ff996308c890eba81a6fa7f1a93

How to fix error? 如何修复错误?

The bean is not created by Spring since componentScan attribute misses the package where ProductServiceImpl is located. bean不是由Spring创建的,因为componentScan属性错过了ProductServiceImpl所在的包。

Besides, @EnableJpaRepositories is missing. 此外,还缺少@EnableJpaRepositories So, Spring cannot wire your repository. 因此,Spring无法连接您的存储库。

@SpringBootApplication
@ComponentScan(basePackages = {"hello","com.ensat.controllers"})
@EntityScan("com.ensat.entities")

should be replaced by : 应该替换为:

@SpringBootApplication
@ComponentScan(basePackages = {"hello","com.ensat.controllers", "com.ensat.services";
})
@EntityScan("com.ensat.entities")
@EnableJpaRepositories("com.ensat.repositories")

It will solve your problem but this way of doing defeats the convention over configuration advantage of Spring and Spring Boot. 它将解决您的问题,但这种做法违反了Spring和Spring Boot的配置优势的约定。

If the Application bean class was located in a parent package which all other bean classes belongs to or to a sub-package of it, you would not need any longer to specify these two annotations : 如果Application bean类位于所有其他bean类所属的父包或它的子包中,则不再需要指定这两个注释:

@ComponentScan(basePackages = {"hello","com.ensat.controllers"})
@EntityScan("com.ensat.entities")

in the @SpringBootApplication class. @SpringBootApplication类中。

For example, moving Application in the com.ensat package and move all your beans in this package or in a child of it will both solve your configuration issues and alleviate your configuration. 例如,在com.ensat包中移动Application并将所有bean移动到此包或它的子包中都将解决配置问题并减轻配置。

package com.ensat;

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

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
    ...
}

Why ? 为什么?

Because the @SpringBootApplication includes already them (and more) : 因为@SpringBootApplication已包含它们(以及更多):

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

But that uses the package of the current class as basePackage value to discover beans/entities/repositories, etc... 但是,它使用当前类的包作为basePackage值来发现bean /实体/存储库等...

The documentation refers this point. 文档提到了这一点。

Here : 这里

Many Spring Boot developers always have their main class annotated with @Configuration, @EnableAutoConfiguration and @ComponentScan. 许多Spring Boot开发人员总是使用@Configuration,@ EnableAutoConfiguration和@ComponentScan注释其主类。 Since these annotations are so frequently used together (especially if you follow the best practices above), Spring Boot provides a convenient @SpringBootApplication alternative. 由于这些注释经常一起使用(特别是如果您遵循上面的最佳实践),Spring Boot提供了一个方便的@SpringBootApplication替代方案。

The @SpringBootApplication annotation is equivalent to using @Configuration, @EnableAutoConfiguration and @ComponentScan with their default attributes @SpringBootApplication注释等同于使用@ Configuration,@ EnableAutoConfiguration和@ComponentScan及其默认属性

Here it discusses about entities discovery provided by @EnableAutoConfiguration 77.3 Use Spring Data repositories point : 这里讨论@EnableAutoConfiguration提供的实体发现77.3使用Spring Data存储库点

Spring Boot tries to guess the location of your @Repository definitions, based on the @EnableAutoConfiguration it finds. Spring Boot会根据找到的@EnableAutoConfiguration尝试猜测@Repository定义的位置。 To get more control, use the @EnableJpaRepositories annotation (from Spring Data JPA). 要获得更多控制,请使用@EnableJpaRepositories批注(来自Spring Data JPA)。

I was experiencing this very error, and it took me a whole afternoon to figure it out. 我遇到了这个错误,我花了整整一个下午才弄清楚。 I have checked every stackoverflow post, spring.io docs, github issue related to this issue, and none of the answers could solve what was wrong. 我已经检查了每个stackoverflow帖子, spring.io docs,与此问题相关的github问题,并且没有一个答案可以解决错误。

In summary, I have tried: 总之,我试过:

  1. Restructuring and renaming my packages and classes 重构和重命名我的包和类
  2. Defining alternate classes for configuration 定义备用类以进行配置
  3. Deleting or remaking erroneous classes 删除或重制错误的类
  4. Annotating my classes as thoroughly as possible 尽可能彻底地注释我的课程
  5. Defining classes altogether 完全定义类
  6. Creating multiple code implementations to @Autowire my repositories 创建多个代码实现到@Autowire我的存储库
  7. Banging my head on the wall in desperation -- okay, I might have overstepped on this a bit 绝望地把我的头撞在墙上 - 好吧,我可能已经超越了这一点

Given I had two repositories, none of them was being recognized by @ComponentScan or @EntityScan annotations. 鉴于我有两个存储库,其中没有一个被@ComponentScan@EntityScan注释识别。 So in summary, I could not instantiate or perform any actions with them. 总而言之,我无法使用它们实例化或执行任何操作。

What did the trick for me, and what i'd suggest you do if you have exhausted your attempts is 对我来说诀窍是什么,如果你已经筋疲力尽,我建议你做什么呢

  1. Double-checking the project dependencies in pom.xml . 仔细检查pom.xml中的项目依赖项 The error might not be related to your code (as it wasn't on mine). 该错误可能与您的代码无关(因为它不在我的代码中)。
  2. If your dependencies are correct, then create a new Maven project with your revised pom.xml . 如果您的依赖项是正确的,那么使用修改后的pom.xml 创建一个新的Maven项目
  3. Update your Maven dependencies . 更新您的Maven依赖项 It might be worth mentioning that I have done so through my IDE, which is the Eclipse + Spring Tool Suite (I don't believe the Spring Tool Suite did much of a difference in updating) 4. Structure your packages so that they follow the best practices (there's a nice article about this here .) 值得一提的是,我通过我的IDE(Eclipse + Spring Tool Suite)完成了这项工作(我不相信Spring Tool Suite在更新方面做了很大的改动)4。 构建你的软件包以便它们遵循最佳实践(有这个一个不错的文章在这里 。)
  4. Then, carefully, migrate your files back. 然后,小心地将文件迁移回来。 Start with the beans, execute your program, check for errors; 从bean开始,执行程序,检查错误; then repositories, execute, test; 然后是存储库,执行,测试; then any startup scripts; 任何启动脚本; then controllers etc. Take your time and make sure everything works. 然后控制器等。花点时间确保一切正常。

Sometimes it can be very painful to debug these applications. 有时调试这些应用程序会非常痛苦。 I have had my share. 我有我的份额。 I hope it helps! 我希望它有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 考虑在您的配置中定义“com.fsse2207.project_backend.service.ProductService”类型的 bean - Consider defining a bean of type 'com.fsse2207.project_backend.service.ProductService' in your configuration 考虑在您的配置中定义类型为“ com.face.ImageRepository”的bean? - Consider defining a bean of type 'com.face.ImageRepository' in your configuration? 春季启动:考虑在配置中定义类型为“ com.repository.services.interfacename”的bean - Spring boot: Consider defining a bean of type 'com.repository.services.interfacename' in your configuration "考虑在配置中定义“com.example.conferencedemo.services.SessionService”类型的 bean" - Consider defining a bean of type 'com.example.conferencedemo.services.SessionService' in your configuration 考虑在您的配置中定义类型为“com.repository.UserRepository”的 bean - Consider defining a bean of type 'com.repository.UserRepository' in your configuration 考虑在您的配置中定义一个类型的 bean - Consider defining a bean of type in your configuration 例外:考虑在你的配置中定义一个类型的 bean - Exception: Consider defining a bean of type in your configuration 考虑在您的配置中定义类型为“UserConverter”的 bean - Consider defining a bean of type 'UserConverter' in your configuration 考虑在您的配置中定义一个类型的 bean:MyBatis - Consider defining a bean of type in your configuration: MyBatis 考虑在你的配置中定义一个类型为 * 的 bean - Consider defining a bean of type * in your configuration
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM