gpt4 book ai didi

java - NoSuchBeanDefinition异常 : No qualifying bean of type [Repository] found for dependency: expected at least 1 bean which qualifies as autowire

转载 作者:行者123 更新时间:2023-11-30 07:21:26 26 4
gpt4 key购买 nike

我发现许多门户网站都解释了类似的问题。但我想这是独特的情况。我在 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[]{"/"};
}

}

SQLDEV配置:

package com.expt.config;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@Configuration
@Profile("SQLDev")
@EnableJpaRepositories(basePackages={"com.expt.repositories"})
public class SQLDevDataSource extends AbstractJpaConfig {

@Override
public DataSource getDataSource() {
// TODO Auto-generated method stub
return createBasicDataSource("jdbc:jtds:sqlserver://LOCAL:1433/MYDB;", "net.sourceforge.jtds.jdbc.Driver", "UNMA", "PWD123");
}
public BasicDataSource createBasicDataSource(String jdbcUrl, String driverClass, String userName, String password) {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl(jdbcUrl);
dataSource.setDriverClassName(driverClass);
dataSource.setUsername(userName);
dataSource.setPassword(password);
return dataSource;
}

}

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");
}

}

AbstrackJpa配置:

   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);
}
}

Controller :

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> {

}

================================================== =========

编辑:(由于添加了很多评论,因此也考虑添加这些详细信息)

我指的是https://github.com/scottfrederick/spring-music 。它使用公共(public)类AppInitializer实现WebApplicationInitializer作为appinitializer。

完整代码在这里,是我在旧项目中使用的。这确实手动注册了配置类并且它正在工作。但当我们从 AbstractAnnotationConfigDispatcherServletInitializer 扩展时就不需要了。

   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);
}
}

如果是 AbstractAnnotationConfigDispatcherServletInitializer,方法 getRootConfigClassesgetServletConfigClasses 会隐式进行注册。现在我正在寻找上面代码的原因不管用。我有解决方法,例如可以通过恢复到 XML 或 WebApplicationInitializer 来使其工作。我正在寻找解决方案和原因(如果可能的话)使用更新的代码而不是 API 文档。我需要一个教程。 API文档无法帮助我解决问题。

最佳答案

您自己的 WebApplicationInitializer 实现和扩展 AbstractAnnotationConfigDispatcherServletInitializer 的实现是不同的。它们的行为不同,这是因为您没有注册自定义 ApplicationContextInitializerjavadoc 中解释了如何注册 ApplicationContextInitializer (请注意设置 ApplicationContextInitializer 集合的 2 个方法。)。

public class AppInitialzer extends AbstractAnnotationConfigDispatcherServletInitializer {

...

protected ApplicationContextInitializer<?>[] getRootApplicationContextInitializers() {
return new ApplicationContextInitializer[] { new SpringAppContInit() } ;
}
}

但是,ApplicationContextInitializer 并没有真正添加任何通过简单设置环境或系统属性无法完成的内容。

spring.profiles.active=SQLDev

当你这样做时,你不需要那个 init。

我也坚信您的 @EnableJpaRepositories 属于错误的类,您想要启用这些的事实不应该取决于您的个人资料。

关于java - NoSuchBeanDefinition异常 : No qualifying bean of type [Repository] found for dependency: expected at least 1 bean which qualifies as autowire,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37498024/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com