Error creating bean with name 'clienteController': Unsatisfied dependency expressed through field 'clienteService';

huangapple go评论83阅读模式
英文:

Error creating bean with name 'clienteController': Unsatisfied dependency expressed through field 'clienteService';

问题

以下是翻译好的内容:

我试图启动我的Spring Boot应用程序,但是下面的错误信息返回给我:

  1. org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为 'clienteController' bean时出错:通过字段 'clienteService' 表达的不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为 'clienteService' bean时出错:在文件 [C:\Users\RenanFreitasDevenz\Documents\api-simulacao\target\classes\com\simulacao\api\services\ClienteService.class] 中定义的bean 'clienteService':通过构造函数参数 0 表达的不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.BeanCreationException: 创建名为 'clienteRepository' bean时出错:在 MongoRepositoriesRegistrar.EnableMongoRepositoriesConfiguration 上声明的 @EnableMongoRepositories 中定义的 com.simulacao.api.repository.ClienteRepository:调用初始化方法失败;嵌套异常是 org.springframework.data.mapping.PropertyReferenceException: 对于类型 Cliente,找不到属性 buscarClientePorId

ClienteRepository 类:

  1. package com.simulacao.api.repository;
  2. import com.simulacao.api.documents.Cliente;
  3. import org.springframework.data.mongodb.repository.MongoRepository;
  4. import org.springframework.stereotype.Repository;
  5. import java.util.Optional;
  6. @Repository
  7. public interface ClienteRepository extends MongoRepository<Cliente, String> {
  8. Cliente buscarClientePorId(String id);
  9. Cliente buscarClientePorNome(String nome);
  10. Optional<Cliente> buscarClientePorCpf(String cpf);
  11. }

ClienteService 类:

  1. package com.simulacao.api.services;
  2. import com.simulacao.api.repository.ClienteRepository;
  3. import com.simulacao.api.documents.Cliente;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Component;
  6. import java.util.List;
  7. import java.util.Optional;
  8. @Component
  9. public class ClienteService {
  10. @Autowired
  11. private final ClienteRepository clienteRepository;
  12. public ClienteService(ClienteRepository clienteRepository) {
  13. this.clienteRepository = clienteRepository;
  14. }
  15. public List<Cliente> listarTodos() {
  16. return this.clienteRepository.findAll();
  17. }
  18. public Cliente listarPorId(String id) {
  19. return clienteRepository.buscarClientePorId(id);
  20. }
  21. public Cliente listarPorNome(String nome) {
  22. return clienteRepository.buscarClientePorNome(nome);
  23. }
  24. public Cliente salvar(Cliente cliente) {
  25. return this.clienteRepository.save(cliente);
  26. }
  27. public Cliente atualizar(Cliente cliente) {
  28. return this.clienteRepository.save(cliente);
  29. }
  30. public Optional<Cliente> verificarCliente(String cpf) {
  31. return this.clienteRepository.buscarClientePorCpf(cpf);
  32. }
  33. public void remover(String id) {
  34. clienteRepository.deleteById(id);
  35. }
  36. }

ClienteController 类:

  1. package com.simulacao.api.controller;
  2. import com.simulacao.api.documents.Cliente;
  3. import com.simulacao.api.documents.Transacao;
  4. import com.simulacao.api.repository.ClienteRepository;
  5. import com.simulacao.api.services.ClienteService;
  6. import com.simulacao.api.services.ContaService;
  7. import io.swagger.annotations.Api;
  8. import io.swagger.annotations.ApiOperation;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.http.HttpStatus;
  11. import org.springframework.http.ResponseEntity;
  12. import org.springframework.web.bind.annotation.*;
  13. import javax.validation.Valid;
  14. import java.util.List;
  15. import java.util.Optional;
  16. @RestController
  17. @RequestMapping("api/clientes")
  18. @Api(value = "API Rest Clientes")
  19. @CrossOrigin(origins = "*")
  20. public class ClienteController {
  21. @Autowired
  22. private ClienteService clienteService;
  23. @Autowired
  24. private ContaService contaService;
  25. @Autowired
  26. private ClienteRepository clienteRepository;
  27. @GetMapping
  28. @ApiOperation(value = "Retorna uma lista de clientes")
  29. public ResponseEntity<List<Cliente>> listarTodos() {
  30. return ResponseEntity.ok(this.clienteService.listarTodos());
  31. }
  32. @GetMapping("/{cpf}")
  33. @ApiOperation(value = "Retorna os dados de um cliente")
  34. public ResponseEntity<Cliente> dadosCliente(@PathVariable String cpf) {
  35. Optional<Cliente> cliente = clienteRepository.buscarClientePorCpf(cpf);
  36. return cliente.map(ResponseEntity::ok)
  37. .orElseGet(() -> ResponseEntity.notFound().build());
  38. }
  39. @PostMapping
  40. @ApiOperation(value = "Salva um cliente")
  41. @ResponseStatus(HttpStatus.CREATED)
  42. public ResponseEntity<Cliente> cadastrar(@Valid @RequestBody Cliente cliente) {
  43. if (!clienteRepository.existsById(cliente.getCpf())) {
  44. return ResponseEntity.notFound().build();
  45. }
  46. return ResponseEntity.ok(this.clienteService.salvar(cliente));
  47. }
  48. // 其他代码部分已省略...
  49. }

Cliente 类:

  1. package com.simulacao.api.documents;
  2. import lombok.*;
  3. import org.hibernate.validator.constraints.br.CPF;
  4. import org.springframework.data.annotation.Id;
  5. import org.springframework.data.mongodb.core.index.Indexed;
  6. import org.springframework.data.mongodb.core.mapping.Document;
  7. import org.springframework.stereotype.Component;
  8. import javax.validation.constraints.NotEmpty;
  9. @Document
  10. @Data
  11. @Builder
  12. @AllArgsConstructor
  13. @NoArgsConstructor
  14. @Component
  15. public class Cliente {
  16. @Id
  17. private String id;
  18. @NotEmpty(message = "Nome não pode ser vazio")
  19. private String nome;
  20. @Indexed(unique = true)
  21. @CPF
  22. private String cpf;
  23. private Conta conta;
  24. private boolean ativo;
  25. }

我尝试过但没有解决的事情:

  1. 使用 @ComponentScan("com.simulacao.api") 注释主类。
  2. 将服务类标记为 @Service。

如果需要更多的代码片段,请告诉我。
有什么可以做的吗?

英文:

I'm trying to start my Spring Boot application but the error below is returning me:

  1. org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &#39;clienteController&#39;: Unsatisfied dependency expressed through field &#39;clienteService&#39;; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name &#39;clienteService&#39; defined in file [C:\Users\RenanFreitasDevenz\Documents\api-simulacao\target\classes\com\simulacao\api\services\ClienteService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name &#39;clienteRepository&#39; defined in com.simulacao.api.repository.ClienteRepository defined in @EnableMongoRepositories declared on MongoRepositoriesRegistrar.EnableMongoRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.mapping.PropertyReferenceException: No property buscarClientePorId found for type Cliente!

Class ClienteRepository:

  1. package com.simulacao.api.repository;
  2. import com.simulacao.api.documents.Cliente;
  3. import org.springframework.data.mongodb.repository.MongoRepository;
  4. import org.springframework.stereotype.Repository;
  5. import java.util.Optional;
  6. @Repository
  7. public interface ClienteRepository extends MongoRepository&lt;Cliente, String&gt; {
  8. Cliente buscarClientePorId(String id);
  9. Cliente buscarClientePorNome(String nome);
  10. Optional&lt;Cliente&gt; buscarClientePorCpf(String cpf);
  11. }

Class ClienteService:

  1. package com.simulacao.api.services;
  2. import com.simulacao.api.repository.ClienteRepository;
  3. import com.simulacao.api.documents.Cliente;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Component;
  6. import java.util.List;
  7. import java.util.Optional;
  8. @Component
  9. public class ClienteService {
  10. @Autowired
  11. private final ClienteRepository clienteRepository;
  12. public ClienteService(ClienteRepository clienteRepository) {
  13. this.clienteRepository = clienteRepository;
  14. }
  15. public List&lt;Cliente&gt; listarTodos() {
  16. return this.clienteRepository.findAll();
  17. }
  18. public Cliente listarPorId(String id) {
  19. return clienteRepository.buscarClientePorId(id);
  20. }
  21. public Cliente listarPorNome(String nome) {
  22. return clienteRepository.buscarClientePorNome(nome);
  23. }
  24. public Cliente salvar(Cliente cliente) {
  25. return this.clienteRepository.save(cliente);
  26. }
  27. public Cliente atualizar(Cliente cliente) {
  28. return this.clienteRepository.save(cliente);
  29. }
  30. public Optional&lt;Cliente&gt; verificarCliente(String cpf) {
  31. return this.clienteRepository.buscarClientePorCpf(cpf);
  32. }
  33. public void remover(String id) {
  34. clienteRepository.deleteById(id);
  35. }
  36. }

Class ClienteController:

  1. package com.simulacao.api.controller;
  2. import com.simulacao.api.documents.Cliente;
  3. import com.simulacao.api.documents.Transacao;
  4. import com.simulacao.api.repository.ClienteRepository;
  5. import com.simulacao.api.services.ClienteService;
  6. import com.simulacao.api.services.ContaService;
  7. import io.swagger.annotations.Api;
  8. import io.swagger.annotations.ApiOperation;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.http.HttpStatus;
  11. import org.springframework.http.ResponseEntity;
  12. import org.springframework.web.bind.annotation.*;
  13. import javax.validation.Valid;
  14. import java.util.List;
  15. import java.util.Optional;
  16. @RestController
  17. @RequestMapping(&quot;api/clientes&quot;)
  18. @Api(value = &quot;API Rest Clientes&quot;)
  19. @CrossOrigin(origins = &quot;*&quot;)
  20. public class ClienteController {
  21. @Autowired
  22. private ClienteService clienteService;
  23. @Autowired
  24. private ContaService contaService;
  25. @Autowired
  26. private ClienteRepository clienteRepository;
  27. @GetMapping
  28. @ApiOperation(value = &quot;Retorna uma lista de clientes&quot;)
  29. public ResponseEntity&lt;List&lt;Cliente&gt;&gt; listarTodos() {
  30. return ResponseEntity.ok(this.clienteService.listarTodos());
  31. }
  32. @GetMapping(&quot;/{cpf}&quot;)
  33. @ApiOperation(value = &quot;Retorna os dados de um cliente&quot;)
  34. public ResponseEntity&lt;Cliente&gt; dadosCliente(@PathVariable String cpf) {
  35. Optional&lt;Cliente&gt; cliente = clienteRepository.buscarClientePorCpf(cpf);
  36. return cliente.map(ResponseEntity::ok)
  37. .orElseGet(() -&gt; ResponseEntity.notFound().build());
  38. }
  39. @PostMapping
  40. @ApiOperation(value = &quot;Salva um cliente&quot;)
  41. @ResponseStatus(HttpStatus.CREATED)
  42. public ResponseEntity&lt;Cliente&gt; cadastrar(@Valid @RequestBody Cliente cliente) {
  43. if (!clienteRepository.existsById(cliente.getCpf())) {
  44. return ResponseEntity.notFound().build();
  45. }
  46. return ResponseEntity.ok(this.clienteService.salvar(cliente));
  47. }
  48. @PutMapping(&quot;depositar/{id}&quot;)
  49. @ApiOperation(value = &quot;Realiza um deposito na conta&quot;)
  50. public ResponseEntity&lt;?&gt; depositar(@PathVariable double valor, @PathVariable String id){
  51. this.contaService.depositar(valor);
  52. return new ResponseEntity&lt;&gt;(HttpStatus.OK);
  53. }
  54. @PutMapping(path = &quot;sacar/{id}&quot;)
  55. @ApiOperation(value = &quot;Realiza um saque na conta&quot;)
  56. public ResponseEntity&lt;?&gt; sacar(@PathVariable double valor, @PathVariable String id) throws Exception {
  57. if (valor &lt;= 0) {
  58. throw new Exception(&quot;valor incorreto&quot;);
  59. }
  60. this.contaService.sacar(valor);
  61. return new ResponseEntity&lt;&gt;(HttpStatus.OK);
  62. }
  63. // Hist&#243;rico de transa&#231;&#245;es
  64. @GetMapping(path = &quot;extratoConta/{id}&quot;)
  65. @ApiOperation(value = &quot;Retorna uma lista de movimenta&#231;&#245;es&quot;)
  66. public ResponseEntity&lt;?&gt; extratoConta(@PathVariable String id){
  67. List&lt;Transacao&gt; transacoes = contaService.extratoConta(id);
  68. return new ResponseEntity&lt;&gt;(transacoes,HttpStatus.OK);
  69. }
  70. @DeleteMapping(&quot;/{clienteId}&quot;)
  71. @ApiOperation(value = &quot;Remove um cliente&quot;)
  72. public ResponseEntity&lt;Void&gt; deletar(@PathVariable String clienteId) {
  73. clienteService.remover(clienteId);
  74. return ResponseEntity.noContent().build();
  75. }
  76. }

Class Cliente:

  1. package com.simulacao.api.documents;
  2. import lombok.*;
  3. import org.hibernate.validator.constraints.br.CPF;
  4. import org.springframework.data.annotation.Id;
  5. import org.springframework.data.mongodb.core.index.Indexed;
  6. import org.springframework.data.mongodb.core.mapping.Document;
  7. import org.springframework.stereotype.Component;
  8. import javax.validation.constraints.NotEmpty;
  9. @Document
  10. @Data
  11. @Builder
  12. @AllArgsConstructor
  13. @NoArgsConstructor
  14. @Component
  15. public class Cliente {
  16. @Id
  17. private String id;
  18. @NotEmpty(message = &quot;Nome n&#227;o pode ser vazio&quot;)
  19. private String nome;
  20. @Indexed(unique=true)
  21. @CPF
  22. private String cpf;
  23. private Conta conta;
  24. private boolean ativo;
  25. }

What I tried to do but didn't fix:
1 - Annotate the main class with @ComponentScan ("com.simulacao.api")

2 - Note the class of service with @Service.

If you need me to post any more code snippets, let me know.

What can be done?

答案1

得分: 1

根据你的代码仓库中所看到的情况,你有一个方法 Cliente buscarClientePorId(String id); 和类似的方法。

你正在使用查询方法(Query Methods),它必须类似于 findByFollowedByPropertyOfYourEntity

根据 Spring Data Repository 文档,
> Spring Data JPA 进行属性检查并遍历嵌套属性。

根据这个文档修改你的方法,应该就可以工作了。

例如,将你的仓库内方法修改为:

  1. @Repository
  2. public interface ClienteRepository extends MongoRepository&lt;Cliente,
  3. String&gt; {
  4. Cliente findById(String id);
  5. }
英文:

As I can see from your code that in your repository, you have method Cliente buscarClientePorId(String id); and similar methods.

You are using Query Methods and it must have something like findByFollowedByPropertyOfYourEntity.

According to the Spring Data Repository docs,
> Spring Data JPA does a property check and traverses nested properties

Change your method according to this docs and it should work.

For instance, change your method inside the repository to

  1. @Repository
  2. public interface ClienteRepository extends MongoRepository&lt;Cliente,
  3. String&gt; {
  4. Cliente findById(String id);
  5. }

答案2

得分: 0

我解决了我的问题。
我必须将存储库的查询适应为:

  1. findByParametro ...

例如:

  1. findBy "属性名称"
英文:

I solved my problem.

I had to adapt the queries of the repository to:

  1. findByParametro ...

Ex:

  1. findBy &quot;Property name&quot;

huangapple
  • 本文由 发表于 2020年9月23日 02:16:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/64015521.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定