web-dev-qa-db-fra.com

java.lang.illegalargumentException: Non Enum Constant trouvé

J'ai cette énumé que je voudrais utiliser pour définir différents statuts:

@Enumerated(EnumType.STRING)
@Column(name = "status", length = 20)
private OnboardingTaskStatus status; 

public enum OnboardingTaskStatus {
    NEW,
    IN_PROGRESS,
    DISABLED,
}

Lorsque j'essaie de créer des spécifications de recherche, je reçois ceci:

public Page<OnboardingTaskDto> findOnboardingTasks(OnboardingTaskSearchParams params, Pageable pageable){
        Specification<OnboardingTasks> spec = (root, query, cb) -> {
            List<Predicate> predicates = new ArrayList<>();
            if (params.getStatus() != null) {
                predicates.add(cb.equal(root.get("status"), params.getStatus()));
            }
            return cb.and(predicates.toArray(new Predicate[predicates.size()]));
        };
        return onboardingTasksService.findAll(spec, pageable).map(onboardingMapper::taskToTaskDTO);
    }

@Getter
@Setter
public class OnboardingTaskSearchParams {
    private String title;
    private String status;

    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}

J'ai essayé de mettre à jour le statut à celui-ci déposé:

predicates.add(cb.equal(root.get("status"), OnboardingTaskStatus.valueOf(params.getStatus())));

Mais j'ai une erreur:

À l'intérieuringtastastatus.2769df0841; Exception imbriquée est java.lang.illegalargumentException: No Enum Constant inumboardingTasTasTastatus.2769DF0841] avec la cause première Java.lang.illegalargumentException: No Enum Constant InboardingTaskstatus.2769DF0841

Savez-vous quel est le moyen approprié de mettre en œuvre la recherche enum sans lancer une erreur si la valeur n'est pas trouvée?

3
Peter Penzov

Votre code est correct . Il semble que vous ayez un étrange problème de compilation en cache. J'en ai eu un peu dans le passé avec de vieilles versions de Project Lombok , mais pas plus.

Essayez de nettoyer votre projet à partir de l'IDE, Maven Clean, en supprimant le dossier de classes compilées ... Si cela ne fonctionne pas, essayez de supprimer @Getter et @Setter de OnboardingTaskSearchParams.

1
sinuhepop

Heres ma solution

public static Optional<OnBoardingTaskStatus> convertStringToEnum(String enumString) {
    Set<String> knownOnBoardingTaskStatusValues = Arrays.asList(OnBoardingTaskStatus.values()).stream().map(Enum::name).collect(Collectors.toSet());
    if(knownOnBoardingTaskStatusValues.contains(enumString))
        return Optional.of(OnBoardingTaskStatus.valueOf(enumString));
    else
        return Optional.empty();
}

Ajoutez cette méthode à votre service, puis ajoutez les éléments suivants à la méthode findOnboardingTasks

    convertStringToEnum(params.getStatus())
            .ifPresent(e -> predicates.add(cb.equal(root.get("status"), e)));
1
Maurice