Walidacja dwóch pól encji

Walidacja dwóch pól encji
Jan Duda
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:6
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

Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 16 godzin
  • Postów:1875
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.


”Engineering is easy. People are hard.” Bill Coughran
krancki
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:74.7261832, -41.7409518
  • Postów:151
0

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

Kopiuj
if(!field1.equals(field2)){
throw ResponsException(code,message)
}
edytowany 2x, ostatnio: krancki
Jan Duda
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:6
0
krancki napisał(a):

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

Kopiuj
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}'}
]

Shalom
coderslab xD
krancki
Wklej kod JanDuda
Charles_Ray
Coderslab uczy na JSP? :)
Jan Duda
tak, coderslab uczy na jsp. Chciałbym skończyć ten projekt i zrobić nowy przyswoić sobie thymeLeaf i inna baze danych niż mysql - MongoDB. Mam nadzieje, że nie jestem już tutaj spalony ale chociaż już wiem żeby pozbywać się z projektów wszystko co związane z "coderslab"
Jan Duda
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:6
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.

Kopiuj
//**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());
    }
}
edytowany 1x, ostatnio: Shalom
Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 16 godzin
  • Postów:1875
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/


”Engineering is easy. People are hard.” Bill Coughran
Jan Duda
Walidator mi działa już na jsp. Jeżeli wpisuję dwa różne hasła to mam błąd już naniesiony na strone. "Validation failed for classes" wyświetla mi się kiedy dwa hasła są poprawne i mam zapisać utworzonego użytkownika do bazy
Charles_Ray
Dlaczego walidacja nie przechodzi jak hasła są równe? Może jakaś inna?
Jan Duda
to jest moja pierwsza utworzona walidacja właśnie..
krancki
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:74.7261832, -41.7409518
  • Postów:151
0

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

Jan Duda
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 2 lata
  • Postów:6
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

krancki
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:74.7261832, -41.7409518
  • Postów:151
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

Kopiuj
   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

Kopiuj
 @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

Kopiuj
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

edytowany 5x, ostatnio: krancki
Jan Duda
Dzięki bardzo za sugestie, postaram się wszystko poprawić

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.