Problem z tablicą, listą i walidacją javax.validation.constraints

0

Witam,
piszę walidator numerów Pesel i mam z nim pewien problem.
Obiekt pesel posiada pole private int[] numbers, w którym mają być zapisywane poszczególne cyfry numeru pesel podane przez użytkownika(nie widzę sensu w tworzeniu oddzielnych pól dla poszczególnych cyfr ani też w zabawie w dzieleniu stringa).
Użytkownik ma wpisać każdą cyfrę w oddzielnym <input>, gdzie są już domyślnie wstawione zera - wystarczy zmienić je tam gdzie cyfry podawanego peselu są różne od 0.
Takie rozwiązanie zadziałało, ale jest problem z użyciem walidacji @PositiveOrZero(javax.validation.constraints) dla tablicy. Jeśli jednak da się to jakoś zrobić to bardzo proszę o wskazówkę.
Przeczytałam na jakimś forum, że taka walidacja zadziałałaby raczej z List, więc próbuję użyć listy zamiast tablicy. Tutaj mam jednak problem z wyświetleniem tej listy na widoku - wyświetla się tylko jeden <input> a i walidacja też nie działa.
Bardzo proszę o pomoc

Pesel.java

@Data
@Component
public class Pesel { //11 cyfr

    @NotEmpty(message = "Pole nie może być puste!")
    @PositiveOrZero(message = "Podana wartość musi być cyfą 0-9")
   // private int[] numbers;

    @NotEmpty(message = "Pole nie może być puste!")
    @PositiveOrZero(message = "Podana wartość musi być cyfą 0-9")
    private List<Integer> numbersList;

    private int[] weights;
    private String result;
    private int control_number;
    private String serial_number;
    private String sex;
    private int year;
    private int month;
    private int day;
    private String birthday;

    public Pesel()
    {
     //numbers = new int[11];
     numbersList = List.of(0,0,0,0,0,0,0,0,0,0,0);
     weights = new int[]{1, 3, 7, 9, 1, 3, 7, 9, 1, 3};
    }

}


PeselController.java

@Controller
public class PeselController {

    private final PeselService peselService;
    private final PeselValidationService peselValidationService;

    public PeselController(PeselService peselService, PeselValidationService peselValidationService){
        this.peselService = peselService;
        this.peselValidationService = peselValidationService;
    }

    @Autowired
    Pesel pesel;

  /*  @RequestMapping("/pesel_validate")
    public String validatePesel(Model model){
        model.addAttribute("pesel", pesel);
        return "pesel_validate";
    }*/
    
    @GetMapping("/pesel")
    public String getPesel(Model model) {
        model.addAttribute("numbers", pesel);
        return "pesel";
    }

    @PostMapping("/validate")
    public String submitPesel(@Valid @ModelAttribute Pesel pesel, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            System.out.println("There were errors");
            bindingResult.getAllErrors().forEach(error -> {
                System.out.println(error.getObjectName() + " " + error.getDefaultMessage());
            });
            return "pesel";
        }
        else {
            //int[] temp = pesel.getNumbers();
            List<Integer> temp2 = pesel.getNumbersList();
      
           /* pesel.setSerial_number(peselService.readSerial(temp));
            pesel.setBirthday(peselService.readBirthday(temp));
            pesel.setSex(peselService.readSex(temp));
            pesel.setControl_number(pesel.getNumbers()[10]);
            pesel.setResult(peselValidationService.ResultText(pesel));*/
            
            return "/pesel_validate";
        }

pesel_validate.html

<h1>Podaj numer PESEL</h1>
<!--<form th:method = "POST" th:action="@{/validate}" th:object="${numbers}" modelAttribute="numbers">
    <table>
    <tr>
    <td th:each="number, itemStat : *{numbers} "><input th:type="text" th:size="2" th:maxlength="1" th:field="*{numbers[__${itemStat.index}__]}" /></td>
    </tr>
    </table>
    <button>Sprawdź</button>
</form>-->


<form th:method = "POST" th:action="@{/validate}" th:object="${numbers}" modelAttribute="numbers">
    <table>
        <tr>
    <td th:each="number, rowStat : ${numbers}">
       <!-- <li th:text="${number}"></li>-->
        <input th:type="text" th:size="2" th:maxlength="1" th:field="*{numbersList[__${rowStat.index}__]}" />
    </td>
        </tr>
    </table>
    <button>Sprawdź</button>
</form>
0

Najpierw zastanów się czym jest pesel. To 11 cyfrowy numer. Pierwsze 2 cyfry to rok urodzenia (każda od 0-9), potem 2 kolejne to miesiąc (pierwsza z tych cyfr musi być 0 albo maks 1, a druga 1-9, wynika to z formatu w jakim zapisuje się miesiąc np. 01 - styczeń, 12 - grudzień itp.), kolejne 2 to dzień (pierwsza cyfra 0-3, druga 0-9, np. 30 - trzydziestego, 19 - dziewiętnastego), potem 2 kolejne to powtórzenie tych 2 poprzednich (dzień) i na końcu jakieś losowe 3 cyfry. Wszystkie te reguły mógłbyś sprawdzić w statycznie metodzie of(String peselCandidate) klasy Pesel, która zwracałaby obiekt Pesel, jeśli udałoby się go utworzyć z podanego Stringa albo rzucała wyjątek w razie jakiś problemów. Na tym właśnie polegają value objecty typu np. podany przez ciebie pesel, że opisują jakąś rzecz ze świata realnego i przechowują reguły, które określają, kiedy można taki obiekt stworzyć. Daruj sobie te magiczne validatory oparte na adnotacjach.
Dzięki temu wystarczy ci jeden jakiś PeselService, w którym po prostu używasz klasy Pesel i metody of na niej i zwracasz jakieś dto z poprawnym peselem.
Potrzebujesz też tylko jednego controllera, którym wysyłasz jakieś CreatePeselDto i dostajesz pesel w przypadku powodzenia albo jakiś exception jeśli coś będzie nie tak.
Jeśli chodzi o te dane typu birthday itd, to one bardziej pasują do klasy Person, która mogłaby być po części tworzona na podstawie peselu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1