Dane szczątkowe z frontu.

1

REST. Spring. W aplikacji mam zapis danych.
Dto, gdzie są walidatory tego co user przyśle. Mapowanie na encje aplikacyjna -> jakies operacje teges szmeges -> Persist. Czyli norma.

Gościu z frontu chce mi wysyłać do Updatu dane, które są mu tylko potrzebne do updatu. Czyli nulle tam gdzie nic nie wpisze.

Oznacza to, ze chcąc odebrać dto musze zrezygnować z walidatorów. Bo będzie krzyczał błąd.
Tez nigdy nie wiem jakie dane tej klasy będą przychodzić, wiec nie mogę wrzucić żadnych walidatorów.

Nie chce natomiast zrezygnować z walidacji tych danych.

Mój pomysł wydaje się dość standardowy, chciałbym dowiedzieć się, czy istnieją inne możliwości.

Wiec mamy zderzenie obiektu z bazy i obecnego obiektu.

  1. Walidacja bedzie nie w DTO a w Encji bazodanowej, oznacza to, ze ta encja bedzie miała walidacje wszystkiego.
  2. Do tego zrobie specjalnego buildera w obiekcie, ktory zapisze mi tylko, te informacje ktore nie sa nullami.
    Jak informacja wchodząca do obiektu jest nullem pozostawi wartość wcześniejszej encji.
    Jak podasz cos zlego na froncie to wykrzaczy sie dopiero w warstwie jpa.

Ma to minus, jaki? Bo jak user poda jakieś dane które nie pasują do polityki to musi przejść cały proces a na samym końcu to wykryć w encji bazodanowej.

0

@DKN:

Też kiedyś myślałem o podobnym pomyśle (tylko pola zmienione).
A nawet, GDYBY front wysyłał WSZYSTKIE, to i tak analiza, KTÓRE są zmienione (choćby dla szczegółowego loga zmian, kto, co kiedy, dlaczego, jaka była pogoda i jaki rozmiar butów).

Nie dokończyłem tych myśli, ale miały punkty wspólne z optimistic locking - tam zachodzi pobieranie przynajmniej części przed updatem. Gdyby to wynieść z perzystencji do repozytorium .. kto wie

0

Nie musisz z niczego rezygnować. Po prostu:

  • niech ci front przesyła listę pól do update - czyli przyjmuj Map<String, Object>
  • potem zaciągasz obiekt, podmieniasz wartości w polach, na zasadzie:
  • puszczasz walidację na tak zmienionym obiekcie
MyDto dto = repository.load(map.get(ID_KEY);
Optional.ofNullable(map.get(FIELD_NAME)).ifPresent(dto::setField));
// ... reszta pól

validate(dto);

Drugą opcją jest po prostu walidowanie pojedynczych pól.

0

Update to osobna operacja biznesowa, która powinna mieć dedykowanego dtosa. Jeśli niektóre pola są opcjonalne, to co zrobisz - spójności danych koniec końców i tak musi chronić model domenowy i baza danych.

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