Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NoSuchBeanDefinitionException:找不到依赖项类型为[Repository]的符合条件的bean:至少需要1个符合autowire条件的bean_Java_Spring_Repository_Spring Data Jpa_Autowired - Fatal编程技术网

Java NoSuchBeanDefinitionException:找不到依赖项类型为[Repository]的符合条件的bean:至少需要1个符合autowire条件的bean

Java NoSuchBeanDefinitionException:找不到依赖项类型为[Repository]的符合条件的bean:至少需要1个符合autowire条件的bean,java,spring,repository,spring-data-jpa,autowired,Java,Spring,Repository,Spring Data Jpa,Autowired,我发现许多门户网站都有类似的问题。但我想这是一种独特的情况。我在spring mvc应用程序中遇到错误 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testController' defined in file [C:\Program Files (x86)\sts-bundle\pivotal-tc-server-developer-3.1.2.

我发现许多门户网站都有类似的问题。但我想这是一种独特的情况。我在spring mvc应用程序中遇到错误

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'testController' defined in file [C:\Program Files (x86)\sts-bundle\pivotal-tc-server-developer-3.1.2.RELEASE\base-instance\wtpwebapps\ExpT1\WEB-INF\classes\com\expt\controller\TestController.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [com.expt.repositories.CategoryRepository]: No qualifying bean of type [com.expt.repositories.CategoryRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.expt.repositories.CategoryRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
    org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185)

.....

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.expt.repositories.CategoryRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373)
代码如下所示。我认为已经复制了足够多的代码。请帮助我了解缺失的内容以及如何解决此问题。任何帮助都将是伟大的。。。!! 代码: 应用初始值设定项:

package com.expt.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;


public class AppInitialzer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // TODO Auto-generated method stub
        return new Class[]{SpringAppContInit.class, SQLDevDataSource.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // TODO Auto-generated method stub
        return new Class[]{WebMvcConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        // TODO Auto-generated method stub
        return new String[]{"/"};
    }

}
SpringAPpContInit:

package com.expt.config;

import org.springframework.context.ApplicationContextInitializer;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

public class SpringAppContInit implements ApplicationContextInitializer<AnnotationConfigWebApplicationContext> {

    @Override
    public void initialize(AnnotationConfigWebApplicationContext applicationContext) {
        // TODO Auto-generated method stub
        ConfigurableEnvironment configEnv = applicationContext.getEnvironment();
        configEnv.addActiveProfile("SQLDev");
    }

}
对于
AbstractAnnotationConfigDispatchersServletInitializer
,方法
getRootConfigClasses
getServletConfigClasses
进行隐式注册。现在我正在寻找上述代码不起作用的原因。我有一种变通方法,可以通过恢复到XMLs或
WebApplicationInitializer
使其正常工作。我正在寻找一个解决方案和原因,如果可能的话,与更新的代码,而不是API文档。我需要一个辅导。API文档不能帮助我解决这个问题

@组件扫描(basePackages=“basePackages”) @EntityScan(basePackages=“base Packages”) @EnableJParepositions(basePackages=“basePackage”)

使用此注释,如果您使用的是spring数据jpa,则扩展Crudepository或PagingAndSortingRepository,而不是JpaRepository。在TestController中,按如下方式提供autowired:

@自动连线(必需=真)类别报告catRepo; 还要在类别中检查类型为BigDecimal的id


您自己的
WebApplicationInitializer
实现和扩展
abstractAnnotationConfigDispatcherservletionInitializer
的实现是不同的。它们的行为不同,这是因为您没有注册您的自定义项。中介绍了如何注册
ApplicationContextInitializer
(请注意设置
ApplicationContextInitializer
s集合的两种方法)

当你这样做的时候,你不需要初始化


我还坚信,您的
@EnableJpaRepositories
属于错误的类,您希望启用这些类的事实不应该取决于您的配置文件。

您认为spring是如何知道您的
应用程序上下文初始值设定项的?仅仅添加一个实现该接口的类是行不通的。你也必须注册它。我还想知道为什么
@EnableJpaRepositories
会依赖于您使用的配置文件…M。Deinum,我正在使用AbstractAnnotation…,你有没有参考资料,你在为我谈论什么?我找不到ApplicationContextInitializer需要的任何附加内容?我会有不同的个人资料。我可以把它分开。我引用了这一点,并衍生了上面的设计,使其变得非常直接和简单。您不需要初始值设定项在配置文件上有所不同,只需将
spring.profiles.active
设置为系统属性的环境即可。如果您有一个初始值设定项,您需要将其注册到上下文中,否则它将完全不起任何作用。因此,我认为AbstractAnnotationConfigDispatchersServletInitializer会自动执行此操作。我的旧应用程序使用WebApplicationInitializer,我使用onStartup方法注册存储库mvc配置。我不知道如何使用AbstractAnnotationConfigDispatchersServletilizer。我在找一些参考文件。你能帮忙吗?我也必须在这里启动?只需将配置文件设置为使用环境变量即可。使用初始值设定项(通常)并没有真正的帮助。除此之外,我也看不到真正的好处,我仍然不相信
@EnableJpaRepositories
应该在那里。这一个有效。我喜欢你让别人学习的方法。但不幸的是,这超出了我的能力范围。你能解释一下你是如何决定增加这个方法的吗?我正在重新组织代码。如果我将概要文件移出SpringAppContInit,类将不会有任何内容。还是需要为applicationContext初始化调用它,对吗?不,不是。
ApplicationContextInitializer
WebApplicationInitializer
是两个完全不同的东西。要创建上下文,您不需要
ApplicationContextInitializer
,只有在上下文启动之前需要执行一些工作时才需要它,例如根据某个环境变量选择概要文件、从数据库加载某些内容、执行一些检查等。感谢M.Deinum。现在明白了。您是否有任何推荐的网页可以阅读,以便清楚地了解应该在哪里为SpringMVC应用程序添加哪些配置?
package com.expt.config;

import org.springframework.context.ApplicationContextInitializer;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

public class SpringAppContInit implements ApplicationContextInitializer<AnnotationConfigWebApplicationContext> {

    @Override
    public void initialize(AnnotationConfigWebApplicationContext applicationContext) {
        // TODO Auto-generated method stub
        ConfigurableEnvironment configEnv = applicationContext.getEnvironment();
        configEnv.addActiveProfile("SQLDev");
    }

}
   package com.expt.config;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceProvider;
import javax.sql.DataSource;

import org.hibernate.dialect.SQLServer2008Dialect;
import org.hibernate.jpa.HibernatePersistenceProvider;
import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.JpaDialect;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;

import com.expt.domain.Category;

public abstract class AbstractJpaConfig {

    public abstract DataSource getDataSource();

    @Bean(name="entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource){
        Map<String, String> properties = new HashMap<String, String>();
        properties.put(org.hibernate.cfg.Environment.HBM2DDL_AUTO, "validate");
        properties.put(org.hibernate.cfg.Environment.DIALECT, SQLServer2008Dialect.class.getName());
        properties.put(org.hibernate.cfg.Environment.SHOW_SQL, "true");

        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource);
        //em.setPackagesToScan(Expense.class.getPackage().getName());
        em.setPackagesToScan(Category.class.getPackage().getName());
        //em.setPersistenceProvider(new HibernatePersistenceProvider());
        em.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        em.setJpaPropertyMap(properties);       
        return em;
    }

    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}
package com.expt.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.expt.domain.Category;
import com.expt.repositories.CategoryRepository;

@RestController
@RequestMapping("/test")
public class TestController {

    CategoryRepository catRepo;

    @Autowired
    public TestController(CategoryRepository catRepo) {
        this.catRepo = catRepo;
    }

    /*private CategoryService catSvc;

    @Autowired
    public TestController(CategoryService catSvc) {
        this.catSvc = catSvc;
    }*/

    @RequestMapping("/simple")
    public String test(){
        return "testing";
    }

    @RequestMapping("/json")
    public Iterable<Category> testJ(){
        return catRepo.findAll();
    }
}
package com.expt.repositories;

import java.math.BigDecimal;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import com.expt.domain.Category;

@Repository
public interface CategoryRepository extends JpaRepository<Category, BigDecimal> {

}
   public class AppInitializer implements WebApplicationInitializer{

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        // TODO Auto-generated method stub
        configureAppContextInitializers(servletContext, SpringAppContInit.class.getName());

        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(RepositoryConfig.class);
        servletContext.addListener(new ContextLoaderListener(rootContext));

        AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();
        webContext.register(WebMvcConfig.class);

        DispatcherServlet dispatcherServlet = new DispatcherServlet(webContext);
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }

    private void configureAppContextInitializers(ServletContext container, String... initClassNames) {
        String initializerClasses = container.getInitParameter(ContextLoader.CONTEXT_INITIALIZER_CLASSES_PARAM);

        String delimitedClassNames = StringUtils.arrayToDelimitedString(initClassNames, " ");

        if (StringUtils.hasText(initializerClasses)) {
            initializerClasses += " " + delimitedClassNames;
        }
        else {
            initializerClasses = delimitedClassNames;
        }

        container.setInitParameter(ContextLoader.CONTEXT_INITIALIZER_CLASSES_PARAM, initializerClasses);
    }
}
public class AppInitialzer extends AbstractAnnotationConfigDispatcherServletInitializer {

    ...    

    protected ApplicationContextInitializer<?>[] getRootApplicationContextInitializers() {
        return new ApplicationContextInitializer[] { new SpringAppContInit() } ;
    }
}
spring.profiles.active=SQLDev