UnsatisfiedDependencyException:使用name创建bean时出错

时间:2017-01-06 17:57:27

标签: java spring spring-mvc

有几天我试图创建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> {

}

我查看了很多类似的问题,但没有人回答他们无法帮助我。

20 个答案:

答案 0 :(得分:17)

ClientRepository应使用@Repository标记进行注释。 使用您当前的配置,Spring将不会扫描该类并了解它。在启动和连线的那一刻将找不到ClientRepository类。

修改 如果添加@Repository代码无效,那么我认为现在问题可能出现在ClientServiceClientServiceImpl上。

尝试使用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定义的类,所以除非您有多个ClientServiceClientRepository的实现,否则可以删除{{ 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)

应用程序需要放在与扫描包相同的目录中:

enter image description here