有几天我试图创建Spring CRUD应用程序。我很困惑。 我无法解决这个错误。
org.springframework.beans.factory.UnsatisfiedDependencyException:使用名称' clientController创建bean时出错':通过方法' setClientService'表达的不满意的依赖关系参数0;嵌套异常是org.springframework.beans.factory.UnsatisfiedDependencyException:使用name' clientService'创建bean时出错:通过字段&clientConpository'表达的不满意的依赖关系嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型' com.kopylov.repository.ClientRepository'的限定bean。可用:预计至少有1个豆有资格作为autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
和这个
org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为' clientService'的错误:通过字段' clientRepository'表达的不满意的依赖关系嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型' com.kopylov.repository.ClientRepository'的限定bean。可用:预计至少有1个豆有资格作为autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}
ClientController
@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);
}
}
ClientRepository
public interface ClientRepository extends JpaRepository<Client, Integer> {
}
我查看了很多类似的问题,但没有人回答他们无法帮助我。
答案 0 :(得分:17)
ClientRepository应使用@Repository
标记进行注释。
使用您当前的配置,Spring将不会扫描该类并了解它。在启动和连线的那一刻将找不到ClientRepository类。
修改强>
如果添加@Repository
代码无效,那么我认为现在问题可能出现在ClientService
和ClientServiceImpl
上。
尝试使用ClientService
注释@Service
(界面)。由于您的服务只应该有一个实现,因此您无需使用可选参数@Service("clientService")
指定名称。 Spring将根据接口名称自动生成它。
此外,正如Bruno所提到的,@Qualifier
中不需要ClientController
因为您只有一个服务实现。
<强> 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";
}
}
答案 1 :(得分:2)
尝试在主要类的顶部添加@EntityScan(basePackages =“在此处插入包名称”)。
答案 2 :(得分:1)
考虑通过XML配置或基于注释的配置正确设置包扫描。
您的@Repository
实施也需要ClientRepository
,以允许Spring在@Autowired
中使用它。由于它不在这里,我们只能假设这是缺少的。
作为旁注,如果将setter方法仅用于@Autowired
,则将@Qualifier
/ @Autowired
直接放在您的成员上会更干净。
@Autowired
@Qualifier("clientRepository")
private ClientRepository clientRepository;
最后,您不需要@Qualifier
是否只有一个实现bean定义的类,所以除非您有多个ClientService
和ClientRepository
的实现,否则可以删除{{ 1}}
答案 3 :(得分:1)
这可能发生,因为你使用的pojos缺乏服务所需的精确构造函数。也就是说,尝试生成serviceClient使用的pojo或对象(模型对象)的所有构造函数,以便客户端可以正确实例化。在您的情况下,为您的客户端对象重新生成构造函数(带参数)(taht是您的模型对象)。
答案 4 :(得分:1)
我刚刚将@Repository
批注添加到了Repository接口,并将@EnableJpaRepositories
(“ domain.repositroy-package”)添加到了主类。一切正常。
答案 5 :(得分:1)
如果您使用的是Spring Boot,则您的主应用程序应该是这样的(只是为了以简单的方式制作和理解事物)-
package aaa.bbb.ccc;
@SpringBootApplication
@ComponentScan({ "aaa.bbb.ccc.*" })
public class Application {
.....
确保已正确注释了@Repository和@Service。
确保所有软件包都属于-aaa.bbb.ccc。*
在大多数情况下,此设置解决了此类琐碎的问题。 Disable randomization of memory addresses是一个完整的例子。希望对您有所帮助。
答案 6 :(得分:0)
如果派生查询方法存在语法错误,则会发生此错误。例如,如果实体类字段和派生方法的名称存在一些不匹配。
答案 7 :(得分:0)
将@Repository注释添加到Spring Data JPA repo
答案 8 :(得分:0)
在组件定义上方添加@Component注释
答案 9 :(得分:0)
还有另一个实例,执行上述所有操作后仍会显示相同的错误。当您相应地更改代码时,请确保解决方案保持原件。这样您就可以轻松返回。因此,再次检查dispatcher-servelet 配置文件的基本程序包位置。是在运行应用程序时扫描所有相关软件包。
<context:component-scan base-package="your.pakage.path.here"/>
答案 10 :(得分:0)
只需将@Service批注添加到服务类的顶部
答案 11 :(得分:0)
那是版本不兼容,其中包括生菜。当我排除在外时,它对我有用。
<!--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>
答案 12 :(得分:0)
查看配置或上下文xml文件中是否缺少您的
答案 13 :(得分:0)
我知道这似乎为时已晚,但将来可能会对其他人有所帮助。
我遇到了同样的错误,问题是spring boot无法读取我的服务包,因此添加:
MenuSection
(必须指定您自己的服务包路径),并且在类@ComponentScan(basePackages = {"com.example.demo.Services"})
(具有主要功能的类)中,并且必须对服务接口进行注释demoApplication
,实现服务接口的类必须用@Service
注释,然后自动连接服务接口。
答案 14 :(得分:0)
如果您在方法定义(“ findBy”)中将字段描述为标准,则必须将该参数传递给方法,否则将收到“通过方法参数表示的不满意的依存关系”异常。
public interface ClientRepository extends JpaRepository<Client, Integer> {
Client findByClientId(); ////WRONG !!!!
Client findByClientId(int clientId); /// CORRECT
}
*我假设您的客户实体具有clientId属性。
答案 15 :(得分:0)
检查Client表的表结构,如果db中的表结构与实体之间不匹配,则会出现此错误。
我有这个错误,这是由于db表和实体之间的主键数据类型不匹配而引起的。
答案 16 :(得分:0)
我遇到了同样的问题,因为我错过了用实体注释标记我的DAO类。我在下面尝试过,错误得到了解决。
/**
*`enter code here`
*/
@Entity <-- was missing earlier
public class Topic {
@Id
String id;
String name;
String desc;
.
.
.
}
答案 17 :(得分:0)
我遇到了完全相同的问题,堆栈跟踪非常长。 在追踪结束时,我看到了这一点:
InvalidQueryException:Keyspace&#39; mykeyspace&#39;不存在
我在cassandra中创建了键空间,并解决了这个问题。
CREATE KEYSPACE mykeyspace
WITH REPLICATION = {
'class' : 'SimpleStrategy',
'replication_factor' : 1
};
答案 18 :(得分:0)
根据documentation,您应该设置XML配置:
<jpa:repositories base-package="com.kopylov.repository" />
答案 19 :(得分:-1)
应用程序需要放在与扫描包相同的目录中: