W aplikacjach restowych sprawdzanie duplikatu np. dodawanego użytkownika w jakim klasie powinno się znajdować?

0

W aplikacjach restowych sprawdzanie duplikatu np. dodawanego użytkownika w jakim pakiecie powinno się znajdować w services czy może znajdować się w controller?

0

Kontroler nie powinien zawierać żadnej logiki.

0

dziękuje. A jak mogę sprawdzić czy nie ma duplikatu np. użytkownika używając w Dao JpaRepositiry? Czy musze pierw pobrać wszystkich z bazy w klasie services prze findAll i tą zwróconą listę jakoś wykorzystać w metodzie create?

0

Nie musisz pobierać wszystkich. Możesz dopisać własną metodę do tego Twojego interfejsu, który implementuje JpaRepository np

 List<User> findByLastName(String string);

Dostaniesz wtedy wszystkich użytkowników o danym nazwisku. Możesz także zadeklarować własne zapytanie np

  //z dokumentacji spring data

 @Query("select u from User u where u.emailAddress = ?1")
  User findByEmailAddress(String emailAddress);

@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?0", nativeQuery = true)
  User findByEmailAddress(String emailAddress);
0

Ja robię to np. tak:
w JpaRepository

  Optional<User> findByUsername(String username);

a potem w UserService:

     public void createUser(User user) {
        if (isPresent(user.getUsername())) {
            throw new DuplicateUserException("Użytkownik '" + user.getUsername() + "' już istnieje!");
        } else {
            this.userRepository.save(user);
        }
    }

    private boolean isPresent(String username) {
        return this.userRepository.findByUsername(username).isPresent();
    }

0

@Czarny Ogrodnik nie.

/// w DAO
 Optional<User> findByUsername(String username);
/// w sewisie
public void createUser(User user) {
     dao.findByUsername(user.getUsername())
         .ifPresent( u -> throw new DuplicateUserException(u);)
     
     dao.save(u);
}

Ale nadal takie coś to zło, bo weryfikacja następuje po stronie Javy... w sumie nie wiadomo po co i na co. Skoro chcemy wyrzucić wyjątek to wystarczy założyć constraint unique na odpowiedniej kolumnie w bazie danych i problem sam się rozwiązuje.

0

@nie100sowny: z przyzwyczajenia do konstrukcji if-else ;-)

@Koziołek: może to i zło, ale zawsze lubię dodatkowo sprawdzić dane po stronie klienta/serwera zanim coś wrzucę do bazy. A po drugie, przy testowaniu na bazie H2 i ustawionym unique nie wyrzuca mi błędu za pierwszym wywołaniem "save".

0

@Daeq, czyli prawidłowo, bo nie masz danych w bazie. Swoją drogą jak już to robić po stronie Javy to nie w serwisie, a jako element walidacji danych. Tyle tylko, że trzeba wtedy napisać własny walidator, ponieważ:

Question: should we add @Unique that would map to @Column(unique=true)?

@Unique cannot be tested at the Java level reliably but could generate a database unique constraint generation. @Unique is not part of the BV spec today.

za JSR-303 Appendix D. Java Persistence 2.0 integration

Wspomniana tu niemożliwość sprawdzenia po stronie Javy w ramach JSR-303 wynika z faktu, że musisz jakoś do walidatora przekazać połączenie do bazy/DAO/DataSource. Dopiero wtedy będzie można pobrać dane z bazy w celu sprawdzenia ich unikalności. Oczywiście nic nie stoi na przeszkodzie by samodzielnie zaimplementować taki walidator.

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