Ответ 1
Общим подходом является проверка достоверности в обоих местах. Но если вы говорите о @Valid, по моему опыту лучше надеть уровень контроллеров.
Это также зависит от того, какую логику проверки мы говорим. Скажем, у вас есть bean:
@Data
public class MyBean {
@NotNull private UUID someId;
@NotEmpty private String someName;
}
Было бы разумно, чтобы этот bean был аннотирован с помощью @Valid
на уровне контроллера, чтобы он даже не доходил до службы. Нет смысла использовать @Valid
для метода службы, потому что, почему бы вам распространить его дальше, пока вы можете сразу же в контроллере решить, является ли это допустимым или нет.
Затем существует второй тип проверки: проверка бизнес-логики. Скажем, для того же bean, что свойство someId является timeUUid, и его метка времени должна быть не более 2 дней после какого-либо события, в противном случае bean должен быть отброшен службой.
Это похоже на случай проверки бизнес-логики, потому что, просто глядя на bean, вы не сможете его проверить, если вы не примените к нему некоторую логику.
Поскольку оба подхода к валидации действительно подтверждают разные вещи, очевидно, что каждый из ваших компонентов MVC - Model, View и Controller - выполняет свою собственную проверку, и он должен быть разумным в отношении того, что он проверяет, не вводя зависимость с другой компоненты.
Что касается отображения ошибки пользователю, да, объект Errors действительно предназначен для использования для проверки bean при уровень контроллера, но вы можете создать какой-то фильтр, который ловит исключения на любом уровне, а затем довольно форматирует его для пользователя. Есть много подходов к этому, и я не уверен, что Spring предписывает, что любой лучше, чем другой.
В зависимости от механизма разрешения (как, например, jstl или jackson или что-то еще), , вероятно, будет склонен рассматривать проверку другим способом. Например, традиционный jstl view resolver будет хорошо работать с устройством, использующим ошибки, а jackson resolver, вероятно, будет работать лучше с комбинацией @ResponseBody и фильтра, который улавливает ошибки и помещает их в предопределенная часть ошибки объекта ответа.