Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Bug] Problema ao usar findAll com atributo Enum

Seguindo, acredito eu, minuciosamente as instruções da aula, ao criar o endpoint de listagem, obtive o seguinte erro:

java.lang.ArrayIndexOutOfBoundsException: Index 51 out of bounds for length 4
    at org.hibernate.type.descriptor.java.EnumJavaType.fromInteger(EnumJavaType.java:194) ~[hibernate-core-6.2.2.Final.jar:6.2.2.Final]

Reparei que os endpoints para pacientes funcionavam perfeitamente, utilizando a mesma estratégia da aula. Testei, então, dropar o database e criá-lo novamente, porém sem a coluna de especialidades médicas (Enum no java). Com isso, o código para listagem dos médicos também funcionou. Ao recriar o database, novamente utilizando o Enum, o erro retornou. Gostaria de orientação de onde posso ter errado.

@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 List<DadosListagemMedico> Listar(){
        return repository.findAll().stream().map(DadosListagemMedico::new).toList();
    }
}
public interface MedicoRepository extends JpaRepository<Medico, Long> {
}
public record DadosListagemMedico(String nome, String email, String crm, Especialidade especialidade) {
    public DadosListagemMedico(Medico medico){
        this(medico.getNome(), medico.getEmail(), medico.getCrm(), medico.getEspecialidade());
    }
}
public record DadosCadastroMedico(
        @NotBlank
        String nome,
        @NotBlank @Email
        String email,
        @NotBlank
        String telefone,
        @NotBlank @Pattern(regexp = "\\d{4,6}")
        String crm,
        @NotNull
        Especialidade especialidade,
        @NotNull @Valid
        DadosEndereco endereco) {
}

@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 crm;
    private String telefone;
    @Enumerated(EnumType.ORDINAL)
    private Especialidade especialidade;
    @Embedded
    private Endereco endereco;

    public Medico(DadosCadastroMedico dados) {
        this.nome = dados.nome();
        this.email = dados.email();
        this.crm = dados.crm();
        this.endereco = new Endereco(dados.endereco());
        this.especialidade = dados.especialidade();
        this.telefone = dados.telefone();
    }
}
2 respostas
solução!

Oi!

O atributo enum deveria estar mapeado com:

@Enumerated(EnumType.STRING)

Mas no seu projeto você colocou EnumType.ORDINAL e por isso pode estar acontecendo o problema.

Vlw, passou despercebido. De fato resolveu!