Após mover os pacotes endereco, medico e paciente para dentro de domain, a aplicação parou de funcionar. Ao tentar executar a aplicação recebo o erro abaixo.
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-09-04T20:36:40.602-03:00 ERROR 3268 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter :
***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'pacienteRepository', defined in med.voll.api.domain.paciente.PacienteRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration, could not be registered. A bean with that name has already been defined in med.voll.api.paciente.PacienteRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
Process finished with exit code 0
Segue o código de Paciente Controller
package med.voll.api.controller;
import jakarta.transaction.Transactional;
import jakarta.validation.Valid;
import med.voll.api.domain.paciente.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.util.UriComponentsBuilder;
@RestController
@RequestMapping("pacientes")
public class PacienteController {
/*
* Devolver void no retorno do metodo e um problema!
* Ao usarmos o void, não informamos o que o Spring precisa devolver.
* Por isso, por padrão, ele retorna o código 200 OK, se a requisição for processada com sucesso.
* Utilizaremos uma classe do Spring chamada ResponseEntity para começaremos a padronizar esses métodos
*
* */
@Autowired
private PacienteRepository repository;
@PostMapping
@Transactional
public ResponseEntity cadastrar(@RequestBody @Valid DadosCadastroPaciente dados, UriComponentsBuilder uriBuilder) {
var paciente = new Paciente(dados);
repository.save(paciente);
var uri = uriBuilder.path("/pacientes/{id}").buildAndExpand(paciente.getId()).toUri();
return ResponseEntity.created(uri).body(new DadosDetalhamentoPaciente(paciente));
}
@GetMapping
public ResponseEntity<Page<DadosListagemPaciente> >listar(@PageableDefault(sort ={"nome"}) Pageable paginacao){
//return repository.findAll(paginacao).map(DadosListagemPaciente::new);
var page = repository.findAllByAtivoTrue(paginacao).map(DadosListagemPaciente::new);
return ResponseEntity.ok(page);
}
@PutMapping
@Transactional
public ResponseEntity atualizar(@RequestBody @Valid DadosAtualizacaoPaciente dados){
var paciente = repository.getReferenceById(dados.id());
//Criar metodo na classe Medico
paciente.atualizarInformacoes(dados);
// Não precisamos fazer a atualização no banco de dados, isso é automático da JPA.
return ResponseEntity.ok(new DadosDetalhamentoPaciente(paciente));
}
@DeleteMapping("/{id}")
@Transactional
/*
* Padronizacao do retorno do metodo
* Valor inicial: public void remover(@PathVariable Long id)
*
* */
public ResponseEntity remover(@PathVariable Long id){
//O comando deleteById realiza uma exclusao fisica no banco de dados.
//repository.deleteById(id);
// Para deletar logicamente vamos:
// Carregar a entidade do banco de dados
var paciente = repository.getReferenceById(id); // recupera o medico do bd
// Setar o campo ativo para 0
paciente.inativar();
//O return se torna obrigatorio por termos padronizado o retorno do metodo.
//O noContent() cria um objeto e chamamos o build() para construir o objeto ResponseEntity.
return ResponseEntity.noContent().build();
}
@GetMapping("/{id}")
public ResponseEntity detalhar(@PathVariable Long id){
var paciente = repository.getReferenceById(id); // recupera o medico do bd
return ResponseEntity.ok(new DadosDetalhamentoPaciente(paciente));
}
}