不满意 DependencyException: 创建具有名称的 bean 时出错

这几天我一直在尝试创建 Spring CRUD 应用程序。 我无法解决这个错误。

Org.springframework.bean. Factory.不满意依赖异常: 创建名为“ clientController”的 bean 时出错: 通过方法“ setClientService”参数0表示的不满意依赖; 嵌套异常是 org.springframework.beans.Factory。不满意依赖异常: 创建名为“ clientService”的 bean 时出错: 通过字段“ clientRepository”表示的依赖性不满意; 嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinition itionException: 没有符合条件的类型为“ com.kopylov.itory”的 bean。ClientRepository’可用: 预计至少有1个具备自动连接候选者资格的 bean。依赖项注释: {@org。注释。自动连线(需求 = 真实)}

还有这个

Org.springframework.bean. Factory.不满意依赖异常: 创建名为“ clientService”的 bean 时出错: 通过字段“ clientRepository”表示的依赖性不满意; 嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinition itionException: 没有符合条件的类型为“ com.kopylov.itory”的 bean。ClientRepository’可用: 预计至少有1个具备自动连接候选者资格的 bean。依赖项注释: {@org。注释。自动连线(需求 = 真实)}

客户控制器

@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> {


}

我看过很多类似的问题,但是没有一个答案能帮助我。

734086 次浏览

Add @Repository annotation to the Spring Data JPA repo

According to documentation you should set XML configuration:

<jpa:repositories base-package="com.kopylov.repository" />

The ClientRepository should be annotated with @Repository tag. With your current configuration Spring will not scan the class and have knowledge about it. At the moment of booting and wiring will not find the ClientRepository class.

EDIT If adding the @Repository tag doesn't help, then I think that the problem might be now with the ClientService and ClientServiceImpl.

Try to annotate the ClientService (interface) with @Service. As you should only have a single implementation for your service, you don't need to specify a name with the optional parameter @Service("clientService"). Spring will autogenerate it based on the interface' name.

Also, as Bruno mentioned, the @Qualifier is not needed in the ClientController as you only have a single implementation for the service.

ClientService.java

@Service
public interface ClientService {


void addClient(Client client);
}

ClientServiceImpl.java (option 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 (option 2/preferred)

@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";
}
}

Considering that your package scanning is correctly set either through XML configuration or annotation based configuration.

You will need a @Repository on your ClientRepository implementation as well to allow Spring to use it in an @Autowired. Since it's not here we can only suppose that's what's missing.

As a side note, it would be cleaner to put your @Autowired/@Qualifier directly on your member if the setter method is only used for the @Autowired.

@Autowired
@Qualifier("clientRepository")
private ClientRepository clientRepository;

Lastly, you don't need the @Qualifier is there is only one class implementing the bean definition so unless you have several implementation of ClientService and ClientRepository you can remove the @Qualifier

Try adding @EntityScan(basePackages = "insert package name here") on top of your main class.

That might happen because the pojos you are using lack of the precise constructor the service needs. That is, try to generate all the constructors for the pojo or objects (model object) that your serviceClient uses, so that the client can be instanced correctly. In your case,regenerate the constructors (with arguments)for your client object (taht is your model object).

The application needs to be placed in the same directory as the scanned package:

enter image description here

I had the exactly same issue, with a very very long stack trace. At the end of the trace I saw this:

InvalidQueryException: Keyspace 'mykeyspace' does not exist

I created the keyspace in cassandra, and solved the problem.

CREATE KEYSPACE mykeyspace
WITH REPLICATION = {
'class' : 'SimpleStrategy',
'replication_factor' : 1
};

I was facing the same issue, and it was, as i missed marking my DAO class with Entity annotations. I tried below and error got resolved.

/**
*`enter code here`
*/
@Entity <-- was missing earlier
public class Topic {
@Id
String id;
String name;
String desc;


.
.
.
}

Check out the table structure of Client table, if there is a mismatch between table structure in db and the entity, you would get this error..

I had this error which was coming due to datatype mismatch of primary key between db table and the entity ...

I just added the @Repository annotation to Repository interface and @EnableJpaRepositories ("domain.repositroy-package") to the main class. It worked just fine.

If you describe a field as criteria in method definition ("findBy"), You must pass that parameter to the method, otherwise you will get "Unsatisfied dependency expressed through method parameter" exception.

public interface ClientRepository extends JpaRepository<Client, Integer> {
Client findByClientId();                ////WRONG !!!!
Client findByClientId(int clientId);    /// CORRECT
}

*I assume that your Client entity has clientId attribute.

I know it seems too late, but it may help others in future.

I face the same error and the problem was that spring boot did not read my services package so add:

@ComponentScan(basePackages = {"com.example.demo.Services"}) (you have to specify your own path to the services package) and in the class demoApplication (class that have main function) and for service interface must be annotated @Service and the class that implement the service interface must be annotated with @Component, then autowired the service interface.

If you are using Spring Boot, your main app should be like this (just to make and understand things in simple way) -

package aaa.bbb.ccc;
@SpringBootApplication
@ComponentScan({ "aaa.bbb.ccc.*" })
public class Application {
.....

Make sure you have @Repository and @Service appropriately annotated.

Make sure all your packages fall under - aaa.bbb.ccc.*

In most cases this setup resolves these kind of trivial issues. Here is a full blown example. Hope it helps.

See if your <context:component-scan base-package="your package "/> is missing in either config or context xml file

That was the version incompatibility where their was the inclusion of lettuce. When i excluded , it worked for me.

<!--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>

Just add @Service annotation to top of the service class

There is another instance still same error will shown after you doing everything above mentioned. When you change your codes accordingly mentioned solutions make sure to keep originals. So you can easily go back. So go and again check dispatcher-servelet configuration file's base package location. Is it scanning all relevant packages when you running application.

<context:component-scan base-package="your.pakage.path.here"/>

Add @Component annotation just above the component definition

This error can occur if there are syntax errors with Derived Query Methods. For example, if there are some mismatches with entity class fields and the Derived methods' names.

I was facing this issue because of duplicate column name staffId and staff_id in same entity class.

    private Integer staffId;
@ManyToOne(cascade = CascadeType.ALL, optional = false)
@JoinColumn(name = "staff_id")
private User user;

My issue got resolved by adding "value" & "nativeQuery" tags in @Query annotation like this:

@Query(value = "select * from employee e where e.email_address = ?1", nativeQuery = true)

In my case, I was using dependency of spring boot 3 in spring boot 4. make sure you use latest dependency version.

you can find that here https://mvnrepository.com/