4
respostas

Erro no SQL

@RestController
@RequestMapping("medicos")
public class MedicoController {

    @Autowired
    private MedicoRepository repository;

    @PostMapping
    @Transactional
    public void cadastrar(@RequestBody @Valid DadosCadastroMedico dados) {
        repository.save(new Medico(dados));
    }
    @GetMapping
    public Page<DadosListagemMedico> listar(Pageable paginacao) {
        return repository.findAll(paginacao).map(DadosListagemMedico::new);
    }

    @PutMapping
    @Transactional
    public void Atualizar(@RequestBody @Valid DadosAtualizacaoMedico dados){
        var medico = repository.getReferenceById(dados.id());
        medico.AtualizarInformacoes(dados);
    }
}

--------------------------------------------

 public record DadosCadastroMedico(
        @NotBlank
        String nome,
        @NotBlank
        @Email
        String email,
        String telefone,
        @NotBlank
        @Pattern(regexp = "\\d{4,6}")
        String crm,
        @NotNull
        Especialidade especialidade,
        @NotNull
        @Valid
        DadosEndereco endereco) {

}
--------------------------------------------
public record DadosListagemMedico(Long id,String nome, String email, String crm, Especialidade especialidade) {

    public DadosListagemMedico(Medico medico){
        this(medico.getId(),medico.getNome(),medico.getEmail(),medico.getCrm(),medico.getEspecialidade());
    }
}
--------------------------------------------

public record DadosAtualizacaoMedico(
        @NotNull
        Long id,
        String nome,
        String telefone,
        DadosEndereco endereco) {
}
--------------------------------------------
public record DadosEndereco(
        @NotBlank
        String logradouro,
        @NotBlank
        String bairro,
        @NotBlank
        @Pattern(regexp = "\\d {8}")
        String cep,
        @NotBlank
        String cidade,
        String uf,
        String numero,
        String complemento) {
}
--------------------------------------------
@Embeddable
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Endereco {
    private String logradouro;
    private String bairro;
    private String cep;
    private String cidade;
    private String uf;
    private String numero;
    private String complemento;

    public Endereco(DadosEndereco endereco) {

     /*   if (endereco == null) {
            throw new IllegalArgumentException("DadosEndereco is null");
        }
*/
        this.logradouro = endereco.logradouro();
        this.bairro = endereco.bairro();
        this.cep = endereco.cep();
        this.cidade = endereco.cidade();
        this.uf = endereco.uf();
        this.numero = endereco.numero();
        this.complemento = endereco.complemento();
    }

    public void AtualizarInformacoes(DadosEndereco dados) {
        if(this.logradouro != null){
            this.logradouro = dados.logradouro();
        }
        if(this.bairro != null){
            this.bairro = dados.bairro();
        }
        if(this.cep != null){
            this.cep = dados.cep();
        }
        if(this.cidade != null){
            this.cidade = dados.cidade();
        }
        if (this.uf != null){
            this.uf = dados.uf();
        }
        if(this.numero != null){
            this.numero = dados.numero();
        }
        if(this.complemento != null){
            this.complemento = dados.complemento();
        }
        }
    }
--------------------------------------------
@Table(name = "medicos")
@Entity(name = "Medico")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = "id")
public class Medico {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nome;
    private String email;
    private String telefone;
    private String crm;
    @Enumerated(EnumType.STRING)
    private Especialidade especialidade;
    @Embedded
    private Endereco endereco;

    public Medico(DadosCadastroMedico dados) {
        this.nome = dados.nome();
        this.email = dados.email();
        this.telefone = dados.telefone();
        this.crm = dados.crm();
        this.especialidade = dados.especialidade();
        this.endereco = new Endereco(dados.endereco());
    }

    public void AtualizarInformacoes(DadosAtualizacaoMedico dados) {
        if(this.nome != null){
            this.nome = dados.nome();
        }
        if(this.telefone != null){
            this.telefone = dados.telefone();
        }
        if(this.endereco != null){
         this.endereco.AtualizarInformacoes(dados.endereco());
        }
    }
}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

4 respostas

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Olá, Ivony! Pelo que percebi, você está tendo um problema com uma exceção EntityNotFoundException. Essa exceção geralmente ocorre quando você tenta buscar uma entidade que não existe no banco de dados.

No seu caso, o problema parece estar na linha onde você tenta buscar um médico pelo ID para atualizar suas informações:

var medico = repository.getReferenceById(dados.id());

O método getReferenceById() está tentando buscar um médico que não existe no banco de dados, por isso ocorre a EntityNotFoundException.

Uma possível solução para isso seria verificar se o médico existe antes de tentar atualizar suas informações. Você pode fazer isso usando o método existsById() do seu repositório. Veja como ficaria:

if (repository.existsById(dados.id())) {
    var medico = repository.getReferenceById(dados.id());
    medico.AtualizarInformacoes(dados);
} else {
    // Tratar o caso em que o médico não existe.
    // Você pode, por exemplo, lançar uma exceção.
}

Dessa forma, você só tentará atualizar as informações do médico se ele realmente existir no banco de dados.

Porém, é importante notar que esse é apenas um exemplo de como você poderia resolver o problema. Dependendo do comportamento desejado para a sua aplicação, pode ser que você precise ajustar essa solução para atender às suas necessidades.

Espero ter ajudado e bons estudos!

bom eu fiz um pouco diferente tbm tentei desse jeito mais nao estou conseguindo

A classe ficou assim

  • Medico Controller
  @PutMapping("/{id}")
    @Transactional
    public void Atualizar(@PathVariable Long id, @RequestBody @Valid DadosAtualizacaoMedico dados) {
        Optional<Medico> optionalMedico = repository.findById(id);

        if (optionalMedico.isPresent()) {
            Medico medico = optionalMedico.get();
            medico.AtualizarInformacoes(dados);
            repository.save(medico);
        } else {
            throw new MedicoNotFoundException(id);
        }
    }
  • tratamento
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MedicoNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ResponseEntity<Object> handleMedicoNotFoundException(MedicoNotFoundException ex){
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }

}

--------------------------------------------------------------------------------------------------------------------------------------------------------------

public class MedicoNotFoundException extends RuntimeException {
    public MedicoNotFoundException(Long id){
        super("Medico com  Id" + id + "Não encontrado!");
    }
}

bom ja deu certo aqui