Spring - polimorfizm, walidacja itp - pytania ogólne

0

Kilka ogólnych pytań - ze szczegółami sobie chyba poradzę, ale nie wiem w którym kierunku mam iść.
Powiedzmy, że mam klasę główną Zadanie, z której dziedziczy kilkadziesiąt klas np:

abstract class Zadanie {
  Date dataRozpoczęcia;
  Date dataZakończenia;
  TypZadania typZadania
}

class Grabienie extends Zadnie {
  String typGrabi;
}
class Kopanie extends Zadanie {
  String typSzpadla;
}
itd...

Ze względu na to, że znaczna część kodu będzie się powtarzała, jak najlepiej to ogarnąć?

Czy jest możliwość stworzenia jednego kontrolera dla Zadania i walidacji w zależności od przesłanych danych? No i czy to jest dobry pomysł? Czy jednak lepiej użyć @RequestMapping dla każdego zadania osobno (tj. /grabienie/, /kopanie/ itp) i napisać osobne walidatory dla każdej klasy? Oczywiście jest to w jakiś sposób powiązane z warstwą serwisową, która ma wyglądać mniej więcej tak :

abstract class ZadanieBaseServiceImpl {
saveZadanie();
}
class ZadanieServiceImpl extends ZadanieBaseServiceImpl {
}
class KopanieServiceImpl extends ZadanieBaseServiceImpl {
wybierzSzpadel();
}
class GrabienieServiceImpl extends ZadanieBaseServiceImpl {
wybierzGrabie();
}

Klasa TypZadania jest zapisana w bazie i przyjmuje wartość w zależności od klasy dziedziczącej np. [ID-Nazwa] 1-Kopanie, 2-Grabienie itp. Czyli po pobraniu z bazy listy wszystkich zadań możemy rozpoznać ich typ. Nie wiem czy jest to lepsze rozwiązanie od instanceof czy nie. Jeżeli nie, to w jakim kierunku powinienem iść?

Zależy mi w głównej mierze na tym, żeby kod był zwięzły i bez powtarzania, żeby nie było dużych problemów np. przy dodawaniu nowych klas czy pól.

0

Do trzymania hierarchicznych encji w bazie: http://www.baeldung.com/hibernate-inheritance
Do walidowania zapytan: https://github.com/java-json-tools/json-schema-validator

0

Może niejasno napisałem, albo nie zrozumiałem odpowiedzi, co jest bardzo możliwe, ze względu na ograniczoną wiedzę :) Jeżeli chodzi o przechowywanie encji w bazie to wybrana strategia to TABLE_PER_CLASS i z tym nie ma problemu. Mimo wszystko czasami trzeba 'ręcznie' ustalić jaki jest typ obiektu np. do mapowania do DTO i z powrotem używam mapstructa i nie znalazłem rozwiązania innego niż użycie instanceof przy dziedziczeniu, to samo przy generowaniu formularzy już w thymeleaf - mógłbym zamiast instanceof wykorzystać pole typZadania - ale czy to jest w jakiś sposób lepsze rozwiązanie?
Nigdy nie używałem JSON i w tym momencie (jeżeli nie pojawią się bardzo mocne powody) nie chciałbym odchodzić od tego czego udało mi się nauczyć do tej pory - mimo wszystko wydaje mi się, że to co przysłałeś nie odpowiada na moje pytanie. Ja bez problemu zwaliduje sobie każdy obiekt. Chodzi mi konkretnie o to, czy powinienem stworzyć jeden kontroller i tam walidować wszystko co wpadnie bez względu na typ (czy tak się w ogóle da i czy warto)

@RequestMapping(value="/zadanie/add/", method=RequestMethod.POST)
public String addNewZadanie(@Valid ZadanieDTO zadanie,...

czy trzeba

@RequestMapping(value="/kopanie/add/", method=RequestMethod.POST)
public String addNewZadanie(@Valid KopanieDTO kopanie,...

@RequestMapping(value="/zadanie/add/", method=RequestMethod.POST)
public String addNewZadanie(@Valid GrabienieDTO grabienie,...

i kolejne kilkadziesiąt...

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