自动连线:预计至少有 1 个 Bean 符合此依赖项的自动连线候选条件



好的,我知道围绕同一个主题有很多问题。但我似乎无法使任何事情起作用。也可能是我还没有完全理解自动布线的概念。 我的问题: 我能够进入所需的页面,但是每当我单击任何按钮以执行操作时,我都会得到 Null 指针异常,这似乎很明显,因为我认为 spring 无法正确映射所需的豆子。

因此,当我添加 @autowired=true 时,它给了我上面给定的异常。 我不确定需要做什么。希望有人可以帮助我解决这个问题。也希望得到解释:) 法典:

@Entity
@Table(name="userDetails")
public class UserDetailModel {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
public int user_id;
public String password;
public String user_name;
public String active_status;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUser_name() {
return user_name;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getActive_status() {
return active_status;
}
public void setActive_status(String active_status) {
this.active_status = active_status;
}

}

控制器:

@RestController
public class UserDetailController {
private Logger logger = (Logger) LoggerFactory.getLogger(UserDetailController.class);
@Autowired(required = true)
private UserRepository userRepository;
@RequestMapping(value="/login", method = RequestMethod.POST)
public @ResponseBody String addNewUser (@RequestBody UserDetailModel user) {
// @ResponseBody means the returned String is the response, not a view name
// @RequestParam means it is a parameter from the GET or POST request
logger.debug("in controller");
UserDetailModel userDtl = new UserDetailModel();
userDtl.setUser_id(user.user_id);
userDtl.setUser_name(user.user_name);
userDtl.setActive_status(user.active_status);
userDtl.setPassword(user.password);
userRepository.save(userDtl);
return "Saved";
}

}

存储 库:

@Repository
public interface UserRepository extends CrudRepository<UserDetailModel,         Long> {}

堆栈跟踪:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDetailController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.springBoot.usl.repo.UserRepository com.springBoot.usl.controller.UserDetailController.userRepository; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.springBoot.usl.repo.UserRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:683)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:944)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:933)
at com.springBoot.usl.controller.WebAppInitializer.main(WebAppInitializer.java:18)

根据回答解决答:我根据周杰伦和卢伊的回答做了一些修改。并更改了我的应用程序配置文件中的注释,如下所示:

@Configuration
@ComponentScan("my.basepackage.*")
@EnableJpaRepositories(basePackages = {"my.basepackage.*"})
@EntityScan("my.basepackage.*")
@EnableAutoConfiguration

希望这对某人有所帮助。

但我不确定*是否是正确的方法。

我能够在注释端进行一些更改来运行您的应用程序。

我使用了与有问题的相同类。请参阅下面的结构和配置。 目录结构

我使用了下面的包并添加了您的类,
com.rcmutha.usl.controller
com.rcmutha.usl.repository

@SpringBootApplication
@ComponentScan({"com.rcmutha*"})
@EntityScan("com.rcmutha*")
@EnableJpaRepositories("com.rcmutha*")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

对于完整的代码: 单击此处获取代码

我认为您的应用程序无法扫描UserRepository类,如果您使用的是 Spring Boot,那么您应该将主类放在包层次结构的顶部。

您还应该使用@EnableJpaRepositories并告诉它存储库的基本包以启用存储库功能

@EnableJpaRepositories(basePackages ={"com.springBoot.usl.repo"})

UserRepository

在当前的 Spring 上下文中根本没有定义。 确保您的类是在 Spring 扫描的包中定义的。您需要在配置类中使用@ComponentScan("org.my.pkg")来使 Spring 扫描软件包。

如果您使用的是 Spring Boot,请确保将主应用程序类放在根包中用@SpringBootApplication注释的其他类之上,因为它包含@ComponentScan

您需要在配置类中启用 JPA 存储库,指定包含存储库的软件包,如下所示

@Configuration
@EnableJpaRepositories(basePackages = {
"com.springBoot.usl.repo"
})
public class ApplicationConfig {
}

应用程序配置示例:

@Configuration
@EnableJpaRepositories(basePackages = {"com.springBoot.usl.repo"})
@EnableTransactionManagement
public class ApplicationConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/xxxx");
dataSource.setUsername("xxxx");
dataSource.setPassword("xxxx");
return dataSource;
}
@Bean
public EntityManagerFactory entityManagerFactory() {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(vendorAdapter);
factory.setPackagesToScan("xx.xxxx.xxxx.xxxx.domain");
factory.setDataSource(dataSource());
factory.afterPropertiesSet();
return factory.getObject();
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory(entityManagerFactory());
return txManager;
}

我知道问题已经解决,但由于像我这样的其他人可能是问题,我决定分享我的问题和解决方案。 我收到了完全相同的错误消息,但问题是类中缺少注释@Service,因此这种类型的对象无法自动连接。放置此注释后,一切正常。

下面是上述类的对象:

@Autowired
private JwtUserDetailsService jwtUserDetailsService;

只是这个注释导致了同样的问题,并且可能会被忽视:

@Service  // annotation that was missing
public class JwtUserDetailsService implements UserDetailsService { ...

我们在 kotlin + spring boot 应用程序中遇到了类似的问题,并且由于这个解决方案略有修改,我们可以解决它:

@SpringBootApplication
@ComponentScan("package.path*")

相关内容

最新更新