Showing validation errors field by field

This commit is contained in:
Francesco 2023-10-10 21:30:49 +02:00
parent 8b88475d8a
commit 13b45e62b8
4 changed files with 46 additions and 6 deletions

View File

@ -58,6 +58,7 @@ import tech.ailef.dbadmin.external.dto.FacetedSearchRequest;
import tech.ailef.dbadmin.external.dto.LogsSearchRequest; import tech.ailef.dbadmin.external.dto.LogsSearchRequest;
import tech.ailef.dbadmin.external.dto.PaginatedResult; import tech.ailef.dbadmin.external.dto.PaginatedResult;
import tech.ailef.dbadmin.external.dto.QueryFilter; import tech.ailef.dbadmin.external.dto.QueryFilter;
import tech.ailef.dbadmin.external.dto.ValidationErrorsContainer;
import tech.ailef.dbadmin.external.exceptions.DbAdminException; import tech.ailef.dbadmin.external.exceptions.DbAdminException;
import tech.ailef.dbadmin.external.exceptions.DbAdminNotFoundException; import tech.ailef.dbadmin.external.exceptions.DbAdminNotFoundException;
import tech.ailef.dbadmin.external.exceptions.InvalidPageException; import tech.ailef.dbadmin.external.exceptions.InvalidPageException;
@ -450,8 +451,9 @@ public class DefaultDbAdminController {
attr.addFlashAttribute("error", e.getMessage()); attr.addFlashAttribute("error", e.getMessage());
attr.addFlashAttribute("params", params); attr.addFlashAttribute("params", params);
} catch (ConstraintViolationException e) { } catch (ConstraintViolationException e) {
attr.addFlashAttribute("errorTitle", "Unable to INSERT row (no changes applied)"); attr.addFlashAttribute("errorTitle", "Unable to INSERT row (validation error)");
attr.addFlashAttribute("error", e.toString()); attr.addFlashAttribute("error", "See below for details");
attr.addFlashAttribute("validationErrors", new ValidationErrorsContainer(e));
attr.addFlashAttribute("params", params); attr.addFlashAttribute("params", params);
} }
@ -474,8 +476,9 @@ public class DefaultDbAdminController {
attr.addFlashAttribute("error", e.getMessage()); attr.addFlashAttribute("error", e.getMessage());
attr.addFlashAttribute("params", params); attr.addFlashAttribute("params", params);
} catch (ConstraintViolationException e) { } catch (ConstraintViolationException e) {
attr.addFlashAttribute("errorTitle", "Unable to INSERT row (no changes applied)"); attr.addFlashAttribute("errorTitle", "Unable to INSERT row (validation error)");
attr.addFlashAttribute("error", e.toString()); attr.addFlashAttribute("error", "See below for details");
attr.addFlashAttribute("validationErrors", new ValidationErrorsContainer(e));
attr.addFlashAttribute("params", params); attr.addFlashAttribute("params", params);
} }
} }
@ -490,8 +493,9 @@ public class DefaultDbAdminController {
attr.addFlashAttribute("error", e.getMessage()); attr.addFlashAttribute("error", e.getMessage());
attr.addFlashAttribute("params", params); attr.addFlashAttribute("params", params);
} catch (ConstraintViolationException e) { } catch (ConstraintViolationException e) {
attr.addFlashAttribute("errorTitle", "Unable to INSERT row (no changes applied)"); attr.addFlashAttribute("errorTitle", "Unable to INSERT row (validation error)");
attr.addFlashAttribute("error", e.toString()); attr.addFlashAttribute("error", "See below for details");
attr.addFlashAttribute("validationErrors", new ValidationErrorsContainer(e));
attr.addFlashAttribute("params", params); attr.addFlashAttribute("params", params);
} }
} }

View File

@ -0,0 +1,28 @@
package tech.ailef.dbadmin.external.dto;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
public class ValidationErrorsContainer {
private Map<String, List<ConstraintViolation<?>>> errors = new HashMap<>();
public ValidationErrorsContainer(ConstraintViolationException e) {
e.getConstraintViolations().forEach(c -> {
errors.putIfAbsent(c.getPropertyPath().toString(), new ArrayList<>());
errors.get(c.getPropertyPath().toString()).add(c);
});
}
public List<ConstraintViolation<?>> forField(String name) {
return errors.getOrDefault(name, new ArrayList<>());
}
public boolean isEmpty() {
return errors.isEmpty();
}
}

View File

@ -1,3 +1,7 @@
.text-red {
color: red;
}
.separator-light { .separator-light {
opacity: 25%; opacity: 25%;
} }

View File

@ -57,6 +57,10 @@
"></th:block> "></th:block>
</th:block> </th:block>
<ul class="text-red mt-2" th:if="${validationErrors != null && !validationErrors.isEmpty()}">
<li th:each="error : ${validationErrors.forField(field.getName())}"
th:text="${error.getMessage()}"></li>
</ul>
<div class="separator mt-3 mb-2 separator-light"></div> <div class="separator mt-3 mb-2 separator-light"></div>
</div> </div>