几天来,我正在尝试创建 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
的实现类在哪里?
ClientRepository 应使用 @Repository
标记进行注释。使用您当前的配置,Spring 不会扫描该类并了解它。在启动和连线的那一刻,将找不到 ClientRepository 类。
编辑 如果添加 @Repository
标记没有帮助,那么我认为问题现在可能出在 ClientService
和 ClientServiceImpl
上。
尝试用 @Service
注释 ClientService
(接口)。由于您的服务应该只有一个实现,因此您不需要使用可选参数 @Service("clientService")
指定名称。 Spring 将根据接口的名称自动生成它。
此外,正如 Bruno 所提到的,ClientController
中不需要 @Qualifier
,因为您只有一个服务实现。
客户端服务.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);
}
}
客户端控制器.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";
}
}
我知道这似乎为时已晚,但它可能会在未来对其他人有所帮助。
我遇到了同样的错误,问题是spring boot没有读取我的服务包,所以添加:
@ComponentScan(basePackages = {"com.example.demo.Services"})
(您必须指定自己的服务包路径)和类 demoApplication
(具有 main 功能的类)和服务接口必须注解 @Service
并且实现服务接口的类必须是用 @Component
注释,然后自动装配服务接口。
尝试在主类顶部添加 @EntityScan(basePackages = "insert package name here")。
如果您使用的是 Spring Boot,您的主应用程序应该是这样的(只是为了以简单的方式制作和理解事物) -
package aaa.bbb.ccc;
@SpringBootApplication
@ComponentScan({ "aaa.bbb.ccc.*" })
public class Application {
.....
确保你有 @Repository 和 @Service 适当的注释。
确保您的所有包裹都属于 - aaa.bbb.ccc.*
在大多数情况下,此设置解决了这些琐碎的问题。 Here 是一个完整的示例。希望能帮助到你。
这可能会发生,因为您使用的 pojos 缺少服务所需的精确构造函数。即尝试为您的 serviceClient 使用的 pojo 或对象(模型对象)生成所有构造函数,以便客户端可以正确实例化。在您的情况下,为您的客户端对象(taht 是您的模型对象)重新生成构造函数(带参数)。
我刚刚将 @Repository
注释添加到 Repository 接口和 @EnableJpaRepositories
("domain.repositroy-package") 到主类。它工作得很好。
应用程序需要与扫描的包放在同一目录下:
https://i.stack.imgur.com/gFQLN.png
我遇到了同样的问题,因为我错过了用实体注释标记我的 DAO 类。我在下面尝试并解决了错误。
/**
*`enter code here`
*/
@Entity <-- was missing earlier
public class Topic {
@Id
String id;
String name;
String desc;
.
.
.
}
将 @Repository 注释添加到 Spring Data JPA 存储库
根据 documentation,您应该设置 XML 配置:
<jpa:repositories base-package="com.kopylov.repository" />
考虑到您的包扫描是通过 XML 配置或基于注释的配置正确设置的。
您的 ClientRepository
实现还需要一个 @Repository
以允许 Spring 在 @Autowired
中使用它。由于它不在这里,我们只能假设那是缺少的。
附带说明一下,如果 setter 方法仅用于 @Autowired
,则将 @Autowired
/@Qualifier
直接放在您的成员上会更简洁。
@Autowired
@Qualifier("clientRepository")
private ClientRepository clientRepository;
最后,您不需要 @Qualifier
,因为只有一个类实现了 bean 定义,因此除非您有多个 ClientService
和 ClientRepository
实现,否则您可以删除 @Qualifier
我遇到了完全相同的问题,堆栈跟踪非常长。在跟踪结束时,我看到了这个:
InvalidQueryException:键空间“mykeyspace”不存在
我在 cassandra 中创建了键空间,并解决了这个问题。
CREATE KEYSPACE mykeyspace
WITH REPLICATION = {
'class' : 'SimpleStrategy',
'replication_factor' : 1
};
查看Client表的表结构,如果db中的表结构与实体不匹配,你会得到这个错误..
我遇到了这个错误,这是由于 db 表和实体之间的主键数据类型不匹配...
如果在方法定义(“findBy”)中将某个字段描述为条件,则必须将该参数传递给方法,否则会出现“通过方法参数表示的不满足依赖关系”异常。
public interface ClientRepository extends JpaRepository<Client, Integer> {
Client findByClientId(); ////WRONG !!!!
Client findByClientId(int clientId); /// CORRECT
}
*我假设您的 Client 实体具有 clientId 属性。
那是他们包含生菜的版本不兼容。当我排除时,它对我有用。
<!--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>
在您执行上述所有操作后,仍然会显示另一个实例相同的错误。当您相应地更改代码时,提到的解决方案确保保留原件。因此,您可以轻松返回。因此,请再次检查 dispatcher-servelet 配置文件的基本包位置。运行应用程序时是否扫描所有相关包?
<context:component-scan base-package="your.pakage.path.here"/>
在组件定义的正上方添加@Component 注解
如果派生查询方法存在语法错误,则可能会发生此错误。例如,如果实体类字段和派生方法的名称不匹配。
查看配置或上下文 xml 文件中是否缺少您的 <context:component-scan base-package="your package "/>
由于同一实体类中重复的列名 staffId 和 staff_id ,我遇到了这个问题。
private Integer staffId;
@ManyToOne(cascade = CascadeType.ALL, optional = false)
@JoinColumn(name = "staff_id")
private User user;
我的问题通过在 @Query 注释中添加“value”和“nativeQuery”标签得到解决,如下所示:
@Query(value = "select * from employee e where e.email_address = ?1", nativeQuery = true)
只需将 @Service 注释添加到服务类的顶部