UnsatisfiedDependencyException:创建具有名称的 bean 时出错
Posted
技术标签:
【中文标题】UnsatisfiedDependencyException:创建具有名称的 bean 时出错【英文标题】:UnsatisfiedDependencyException: Error creating bean with name 【发布时间】:2017-05-21 13:25:14 【问题描述】:几天来,我正在尝试创建 Spring CRUD 应用程序。我糊涂了。 我无法解决这个错误。
org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“clientController”的bean时出错:通过方法“setClientService”参数0表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“clientService”的 bean 时出错:通过字段“clientRepository”表示不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“com.kopylov.repository.ClientRepository”类型的合格 bean 可用:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true)
还有这个
org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“clientService”的bean时出错:通过字段“clientRepository”表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“com.kopylov.repository.ClientRepository”类型的合格 bean 可用:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true)
客户端控制器
@Controller
public class ClientController
private ClientService clientService;
@Autowired
@Qualifier("clientService")
public void setClientService(ClientService clientService)
this.clientService=clientService;
@RequestMapping(value = "registration/add", method = RequestMethod.POST)
public String addUser(@ModelAttribute Client client)
this.clientService.addClient(client);
return "home";
ClientServiceImpl
@Service("clientService")
public class ClientServiceImpl implements ClientService
private ClientRepository clientRepository;
@Autowired
@Qualifier("clientRepository")
public void setClientRepository(ClientRepository clientRepository)
this.clientRepository=clientRepository;
@Transactional
public void addClient(Client client)
clientRepository.saveAndFlush(client);
客户端存储库
public interface ClientRepository extends JpaRepository<Client, Integer>
我查看了很多类似的问题,但没有一个答案对我有帮助。
【问题讨论】:
ClientRepository
的实现类在哪里?
@Arpit 我只在 ClientServiceImpl 中创建了一个 ClientRepository 的实例。这是我第一次体验这个 Spring Data JPA,我不知道如何正确操作。所以我按照例子
@Arpit 请看我在github上的项目(我加链接)
【参考方案1】:
ClientRepository 应该使用@Repository
标签进行注释。
使用您当前的配置,Spring 不会扫描该类并了解它。在启动和接线的那一刻,将找不到 ClientRepository 类。
编辑
如果添加@Repository
标签没有帮助,那么我认为问题可能出在ClientService
和ClientServiceImpl
。
尝试用@Service
注释ClientService
(接口)。由于您的服务应该只有一个实现,因此您不需要使用可选参数@Service("clientService")
指定名称。 Spring 将根据接口名称自动生成它。
此外,正如布鲁诺所提到的,ClientController
中不需要@Qualifier
,因为您只有一个服务实现。
ClientService.java
@Service
public interface ClientService
void addClient(Client client);
ClientServiceImpl.java(选项 1)
@Service
public class ClientServiceImpl implements ClientService
private ClientRepository clientRepository;
@Autowired
public void setClientRepository(ClientRepository clientRepository)
this.clientRepository=clientRepository;
@Transactional
public void addClient(Client client)
clientRepository.saveAndFlush(client);
ClientServiceImpl.java(选项 2/首选)
@Service
public class ClientServiceImpl implements ClientService
@Autowired
private ClientRepository clientRepository;
@Transactional
public void addClient(Client client)
clientRepository.saveAndFlush(client);
ClientController.java
@Controller
public class ClientController
private ClientService clientService;
@Autowired
//@Qualifier("clientService")
public void setClientService(ClientService clientService)
this.clientService=clientService;
@RequestMapping(value = "registration", method = RequestMethod.GET)
public String reg(Model model)
model.addAttribute("client", new Client());
return "registration";
@RequestMapping(value = "registration/add", method = RequestMethod.POST)
public String addUser(@ModelAttribute Client client)
this.clientService.addClient(client);
return "home";
【讨论】:
现在我有这样的错误:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“com.kopylov.repository.ClientRepository”类型的合格bean可用:预计至少有1个有资格作为自动装配候选者的bean .依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true) 我也遇到了同样的问题,忘记在impl中添加Service注解了。添加服务注释解决了这个问题。谢谢@Alex【参考方案2】:我知道这似乎为时已晚,但将来可能会对其他人有所帮助。
我遇到了同样的错误,问题是spring boot没有读取我的服务包所以添加:
@ComponentScan(basePackages = "com.example.demo.Services")
(你必须指定你自己的服务包路径)和类demoApplication
(具有main函数的类)和服务接口必须注解@Service
和实现服务的类接口必须用@Component
注解,然后自动装配服务接口。
【讨论】:
能不能把它说得更清楚明白【参考方案3】:尝试在主类顶部添加 @EntityScan(basePackages = "insert package name")。
【讨论】:
我没有主课怎么办?【参考方案4】:如果你使用的是 Spring Boot,你的主应用应该是这样的(只是为了简单地制作和理解事物) -
package aaa.bbb.ccc;
@SpringBootApplication
@ComponentScan( "aaa.bbb.ccc.*" )
public class Application
.....
确保您已对 @Repository 和 @Service 进行了适当注释。
确保您的所有软件包都属于 - aaa.bbb.ccc.*
在大多数情况下,此设置可以解决这类琐碎问题。 Here 是一个完整的例子。希望对您有所帮助。
【讨论】:
这个固定的地雷。多谢。但我想知道为什么即使它们存在,它也不会自动检测到我的 bean/类。这是某种错误吗?无论如何,我的应用程序都在一个包下,我没有任何其他包。我不明白为什么我必须手动声明组件类。 好吧,如果您使用的是@SPringbootApplication 注解,那么您不需要@ComponentScan。 @SpringBootApplication = @Configuration + @ComponentScan + @EnableAutoConfiguration【参考方案5】:这可能会发生,因为您使用的 pojos 缺少服务所需的精确构造函数。也就是说,尝试为你的 serviceClient 使用的 pojo 或对象(模型对象)生成所有构造函数,以便客户端可以正确实例化。在您的情况下,为您的客户端对象(taht 是您的模型对象)重新生成构造函数(带参数)。
【讨论】:
【参考方案6】:我刚刚将 @Repository
注释添加到 Repository 接口和 @EnableJpaRepositories
("domain.repositroy-package") 到主类。效果很好。
【讨论】:
我不确定是否会帮助 OP,但如果有人使用 SpringBoot 并拥有 @EnableAutoConfiguration(exclude = DataSource/HibernateJpa..etc 这些排除可能会拒绝 spring 自动验证声明的注释在 CRUD 类中,因此删除排除可能会与在 Main 类中添加 @EnableJpaRepositories 一起修复它【参考方案7】:应用需要和扫描的包放在同一目录:
【讨论】:
【参考方案8】:我也面临同样的问题,因为我错过了使用实体注释标记我的 DAO 类。我在下面尝试并解决了错误。
/**
*`enter code here`
*/
@Entity <-- was missing earlier
public class Topic
@Id
String id;
String name;
String desc;
.
.
.
【讨论】:
【参考方案9】:向 Spring Data JPA 存储库添加 @Repository 注释
【讨论】:
【参考方案10】:根据documentation你应该设置XML配置:
<jpa:repositories base-package="com.kopylov.repository" />
【讨论】:
这是我的 appContext.xml 中的内容,但没有帮助【参考方案11】:考虑到您的包扫描是通过 XML 配置或基于注释的配置正确设置的。
您还需要在您的 ClientRepository
实现上使用 @Repository
以允许 Spring 在 @Autowired
中使用它。由于它不在这里,我们只能假设那是缺少的。
附带说明,如果 setter 方法仅用于 @Autowired
,则将 @Autowired
/@Qualifier
直接放在您的成员上会更简洁。
@Autowired
@Qualifier("clientRepository")
private ClientRepository clientRepository;
最后,您不需要 @Qualifier
,因为只有一个类实现了 bean 定义,所以除非您有多个 ClientService
和 ClientRepository
的实现,否则您可以删除 @Qualifier
【讨论】:
你只是在写已经发布过的东西【参考方案12】:我遇到了完全相同的问题,堆栈跟踪非常长。 在跟踪结束时,我看到了这个:
InvalidQueryException:键空间“mykeyspace”不存在
我在 cassandra 中创建了键空间,并解决了问题。
CREATE KEYSPACE mykeyspace
WITH REPLICATION =
'class' : 'SimpleStrategy',
'replication_factor' : 1
;
【讨论】:
【参考方案13】:查看Client表的表结构,如果db中的表结构与实体不匹配,你会得到这个错误..
我遇到了这个错误,这是由于 db 表和实体之间主键的数据类型不匹配...
【讨论】:
【参考方案14】:如果在方法定义(“findBy”)中将某个字段描述为条件,则必须将该参数传递给方法,否则会出现“通过方法参数表示的不满足依赖关系”异常。
public interface ClientRepository extends JpaRepository<Client, Integer>
Client findByClientId(); ////WRONG !!!!
Client findByClientId(int clientId); /// CORRECT
*我假设您的 Client 实体具有 clientId 属性。
【讨论】:
【参考方案15】:那是他们包含生菜的版本不兼容。当我排除时,它对我有用。
<!--Spring-Boot 2.0.0 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
【讨论】:
【参考方案16】:另一个实例在您执行上述所有操作后仍会显示相同的错误。当您相应地更改代码时,提到的解决方案确保保留原件。因此,您可以轻松返回。因此,请再次检查 dispatcher-servelet 配置文件的基本包位置。运行应用程序时是否扫描所有相关包。
<context:component-scan base-package="your.pakage.path.here"/>
【讨论】:
【参考方案17】:在组件定义上方添加@Component注解
【讨论】:
【参考方案18】:如果派生查询方法存在语法错误,则可能会发生此错误。例如,如果实体类字段和派生方法的名称不匹配。
【讨论】:
【参考方案19】:我遇到了这个问题,因为同一实体类中有重复的列名 staffId 和 staff_id。
private Integer staffId;
@ManyToOne(cascade = CascadeType.ALL, optional = false)
@JoinColumn(name = "staff_id")
private User user;
【讨论】:
【参考方案20】:只需在服务类顶部添加@Service 注解
【讨论】:
【参考方案21】:查看您的 <context:component-scan base-package="your package "/>
是否在配置或上下文 xml 文件中丢失
【讨论】:
以上是关于UnsatisfiedDependencyException:创建具有名称的 bean 时出错的主要内容,如果未能解决你的问题,请参考以下文章