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>