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?
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
.
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)));