Tworzę Rest API za pomocą Spring Boot i używam Hibernate Validation do sprawdzania poprawności danych wejściowych.
Ale potrzebuję również innych rodzajów sprawdzania poprawności, na przykład gdy trzeba zaktualizować dane, jeśli identyfikator firmy nie istnieje, chcę zgłosić niestandardowy wyjątek.
Czy ta walidacja powinna znajdować się na warstwie usługowej czy kontrolującej?
Warstwa serwisowa:
public Company update(Company entity) {
if (entity.getId() == null || repository.findOne(entity.getId()) == null) {
throw new ResourceNotFoundException("can not update un existence data with id : "
+ entity.getId());
}
return repository.saveAndFlush(entity);
}
Warstwa kontrolera:
public HttpEntity<CompanyResource> update(@Valid @RequestBody Company companyRequest) {
Company company = companyService.getById(companyRequest.getId());
Precondition.checkDataFound(company,
"Can't not find data with id : " + companyRequest.getId());
// TODO : extract ignore properties to constant
BeanUtils.copyProperties(companyRequest, company, "createdBy", "createdDate",
"updatedBy", "updatedDate", "version", "markForDelete");
Company updatedCompany = companyService.update(company);
CompanyResource companyResource = companyAssembler.toResource(updatedCompany);
return new ResponseEntity<CompanyResource>(companyResource, HttpStatus.OK);
}
źródło
Sprawdzanie poprawności hibernacji to sprawdzanie integralności danych. Aby uniknąć wyjątków RuntimeExceptions z bbdd. Są to właściwie te same walidacje, które powinieneś kontrolować za pomocą Constrains . Ponieważ tylko warstwa biznesowa powinna zasilać warstwę trwałości, możesz (lub nie, zależnie od ciebie) ufać poprawności danych pochodzących z warstwy biznesowej
Nie umieszczam weryfikacji w DAO. Oczekuję poprawnych danych z wyższych warstw. W przypadku błędu deleguję na bbdd odpowiedzialność za zapoznanie się z jego treścią.
Następnie następuje walidacja na poziomie biznesowym. Wszystkie walidacje biznesowe koncentrowały się na zachowaniu spójności danych, a nie ich integralności .
Na koniec robię poprzednie walidacje na warstwie kontrolnej. Te związane tylko z taką warstwą.
Wkrótce zobaczysz, które walidacje mają być wdrożone na poziomie biznesowym. Najczęstsze: kontrola id. Ten można łatwo wdrożyć na obu warstwach. Jeśli spodziewasz się, że wielu kontrolerów lub klientów zajmie się twoją warstwą biznesową, zamiast wszędzie powtarzać tę samą weryfikację, będzie to doskonały kandydat do umieszczenia w warstwie biznesowej.
Czasami kontrolery mają swoje własne zasady i warunki, które nie zostaną odtworzone w żadnej innej fasadzie. Następnie jest kandydatem do takiego kontrolera.
Zastanów się, na co się zgadzasz i jeśli chcesz zastosować to dla wszystkich, bez względu na wszystko. Lub jeśli jest to walidacja kontekstowa („Sprawdzam coś, co dzieje się tylko przy określonej elewacji kontrolnej / widokowej).
źródło
W naszym sklepie Java celowo podzieliliśmy sprawdzanie poprawności widgetów internetowych na trzy osobne operacje.
Jeśli warstwa 1 ulegnie awarii, nie sprawdzamy 2 lub 3. Podobnie, jeśli 1 zakończy się niepowodzeniem, a 2 nie, nie robimy 3. To zatrzymuje generowanie fałszywych komunikatów o błędach.
Pytasz o wartości w wywołaniu REST, a nie o zawartość widżetu, ale obowiązują te same zasady.
źródło
Testowane podejście cieniuje światło, w końcu nie ma kontrolera i musisz wybrać inną opcję. Oczywiście zasady biznesowe powinny znajdować się w jednym miejscu, a to kolejne ograniczenie w waszej rezygnacji.
źródło