Я создаю Rest API с помощью Spring Boot и использую Hibernate Validation для проверки входных данных запроса.
Но мне также нужны другие виды проверки, например, когда необходимо проверить обновление данных, если идентификатор компании не существует, я хочу создать специальное исключение.
Должна ли эта проверка располагаться на уровне службы или на уровне контроллера?
Уровень обслуживания:
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);
}
Уровень контроллера:
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);
}
источник
Проверки гибернации - это проверка целостности данных. Чтобы избежать RuntimeExceptions от bbdd. Это почти те же проверки, которые вы должны контролировать с помощью Constrains . Поскольку только постоянный уровень должен подпитывать постоянный уровень, вы можете (или не можете сами) доверять правильности данных, поступающих с вашего бизнес-уровня
Я не помещаю проверки в DAO. Я ожидаю достоверных данных из верхних слоев. В случае ошибки я делегирую bbdd ответственность знать о его содержимом.
Затем идет проверка на бизнес-уровне. Все проверки бизнеса были направлены на поддержание согласованности данных, а не их целостности .
Наконец, я делаю предыдущие проверки на контрольном слое. Те, которые связаны только с таким слоем.
Вскоре вы увидите, какие проверки предназначены для внедрения на бизнес-уровне. Наиболее распространенный: контроль идентификатора. Это можно легко реализовать на обоих уровнях. Если вы ожидаете, что многие контроллеры или клиенты будут использовать ваш бизнес-уровень, тогда вместо повсеместного повторения одной и той же проверки это будет отличным кандидатом на включение в бизнес-уровень.
Иногда контроллеры имеют свои собственные правила и условия, которые не будут воспроизведены на любом другом фасаде. Тогда это кандидат, который будет помещен в такой контроллер.
Подумайте о том, что вы подтверждаете, и если вы хотите применить его для всех, несмотря ни на что. Или, если это контекстная проверка («Я проверяю то, что происходит только на определенном фасаде элемента управления / представления).
источник
В нашем магазине Java мы специально разделили проверку веб-виджетов на три отдельные операции.
Если происходит сбой 1-го уровня, мы не проверяем 2 или 3. Аналогично, если 1 успешен, а 2 не выполняется, мы не делаем 3. Это останавливает генерирование ложных сообщений об ошибках.
Вы спрашиваете о значениях в вызове REST, а не о содержимом виджета, но применяются те же принципы.
источник
Протестируйте подход, чтобы затенить свет, ведь нет контроллера, и вы должны выбрать другой вариант. Очевидно, что бизнес-правила должны быть в одном месте, и это еще одно ограничение в вашем решении.
источник