Walidacja dwóch pól encji

0

Cześć,
chciałbym zrobić własny walidator dwóch pól w encji User - password i confirmedPassword. Czy ktoś ma materiały, pomysł jak to zrobić i mógłby mi w tym pomóc? Używam spring boota oraz jsp. Wcześniej próbowałem tego podejścia https://github.com/danielolszewski/blog/tree/master/spring-custom-validation/src/main/java/com/dolszewski/blog/crossfield ale niestety mam błąd chociaż wygląda to na najprostsze rozwiązanie.

Dzięki za jakąkolwiek pomoc

2

Jaki błąd dostajesz? Nie wiem czy by default odpala się bean validation (mechanizm odpowiedzialny za odpalenie walidatora, który podałeś). Możesz samodzielnie sprawdzić warunek i rzucić wyjątek ConstraintValidationException (chyba tak się nazywa), może załapie.

0

Jaki błąd masz ? Możesz zrobić to tak lub logikę sprawdzającą wstawić w serwisie.

if(!field1.equals(field2)){
throw ResponsException(code,message)
}
0
krancki napisał(a):

Jaki błąd masz ? Możesz zrobić to tak lub logikę sprawdzającą wstawić w serwisie.

if(!field1.equals(field2)){
throw ResponsException(code,message)
}

Tak naprawdę przy dodawaniu użytkownika, kiedy hasła się zgadzają występuje błąd:

Validation failed for classes [pl.coderslab.charity.entity.User] during persist time for groups [javax.validation.groups.Default, ] List of constraint violations:[ ConstraintViolationImpl{interpolatedMessage='{pl.coderslab.passwordValidator.error.message}', propertyPath=, rootBeanClass=class pl.coderslab.charity.entity.User, messageTemplate='{pl.coderslab.passwordValidator.error.message}'} ]
javax.validation.ConstraintViolationException: Validation failed for classes [pl.coderslab.charity.entity.User] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
ConstraintViolationImpl{interpolatedMessage='{pl.coderslab.passwordValidator.error.message}', propertyPath=, rootBeanClass=class pl.coderslab.charity.entity.User, messageTemplate='{pl.coderslab.passwordValidator.error.message}'}
]

0

Mam nadzieje, że przez coderslab nie jestem już z automatu na tym forum spalony. Chociaż patrząc na to co się tutaj o tym myśli, powinienem każdy mój projekt odcinać od coderslab. No nic, piszę do Was o pomoc, pewnie bardzo prostej sprawie. Nie chce żeby to było prowadzenie za rączkę ale już nie mam pomysłu co jest przyczyną błędu.

//**Encja**
@Entity
@PasswordConfirmed
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;
    private String email;

    private String password;
    private String confirmedPassword;
    private boolean enabled = false;

    @OneToMany
    private List<Donation> donations = new ArrayList<>();

    @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

// gettery settery

//**Interface**
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {PasswordValidator.class})
public @interface PasswordConfirmed {
    String message() default "{pl.coderslab.passwordValidator.error.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}


// Walidator****
public class PasswordValidator implements ConstraintValidator<PasswordConfirmed, User> {
    
    @Override
    public void initialize(PasswordConfirmed constraint) {

    }

    @Override
    public boolean isValid(User user, ConstraintValidatorContext context) {
        return user.getPassword().equals(user.getConfirmedPassword());
    }
}
0

Dostajesz błąd, bo odpala się walidator. Teraz tylko trzeba użyć magii Springa, żeby wyświetlić go na stronie JSP. Może to Ci pomoże: https://mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/

0

Przeleć debugerem i zobacz jakie wartości porównuje

0
Charles_Ray napisał(a):

Dostajesz błąd, bo odpala się walidator. Teraz tylko trzeba użyć magii Springa, żeby wyświetlić go na stronie JSP. Może to Ci pomoże: https://mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/

na githubie jest mój cały kod:

https://github.com/JanDuda6/projectCharity

2

ogólnie to kod jest raczej słaby, a przyczyną błędu jest to że validator uruchamia się przy zapisywaniu do bazy a przed zapisaniem do bazki robisz

   public void saveUser(User user) {
       user.setPassword(passwordEncoder.encode(user.getPassword()));  -> $2a$10$skEEkO0fV5cK3sjs6J23hOsX9JwELVCGWBPJriAuOpiPwwIuK10Le
       user.setConfirmedPassword(passwordEncoder.encode(user.getConfirmedPassword()));  -> $2a$10$FJ2OEfnixoTzu1vQZkK3Lulxp8f4UujBTQe3ZBTMw2C6o5.T//l1K
       userRepository.save(user);
   }

ogólnie to wydziel sobie DTO
zrób warstwy domenowo,
Używaj optionali
JSF [*]
W kontrolerach nie trzymaj logiki biznesowej np

 @PostMapping("/admin/addAdmin") <-- crud
    public String postAddAdmin <-- co to za nazwa metody(User user) throws MessagingException {
        String password = userService.generateRandomPassword();  <---*
        user.setPassword(password);<---*
        userService.saveUser(user);   * to wszystko powinno znaleźć się w tej metodzie, nazwa metody jakąś inną np createNewAccount 
        emailService.sendEmail(user.getEmail(), "Hasło do portalu", "Twoje hasło to: " + password);<---*
        return "redirect:/allAdmins";
    }

formatowanie

donationRepository.findAll().stream().mapToInt(a -> a.getQuantity()).sum();
->
donationRepository.findAll()
        .stream()
        .mapToInt(Donation::getQuantity)
        .sum();

pisz testy
podłącz sobie h2

ConfirmationToken zamiast tego użyj sobie JWT i sobie skonfiguruj filtry

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