Почему:
Зачем использовать AOP для достижения проверки?
отвечать:
Spring MVC имеет свой собственный механизм проверки @Valid + BindingResult, но эта реализация по умолчанию должна получать привязку в методе контроллера для выполнения проверки.
например:
if (result.haserrors ()) {list <objecterror> allerrors = result.getAllerrors (); Список <string> errorlists = new ArrayList <> (); for (objecterror objecterror: allerrors) {errorlists.add (objecterror.getDefaultmessage ()); }}Получите ошибки. Если это реализовано, каждый метод, который требует проверки, должен вызывать неоднократно, даже если он инкапсулирован.
Возможно, приведенное выше утверждение не может указывать на реализацию Spring @Valid + BindingResult. Позвольте мне дать вам «каштан».
1. Каштан (старая версия)
1.1 Слой интерфейса (ИДАЛ)
Например: простой запрос POST, @Requestbody получает данные запроса, @Valid + BindingResult выполняет проверку
@Responsebody @postmapping ("body") public responsevo bodypost (@requestbody @valid testvo body, bindingresult result) {// проверка ошибка if (result.haserrors ()) {list <objecterror> allorrors = result.getallerrors (); List <string> lists = new ArrayList <> (); for (objecterror objecterror: allerrors) {lists.add (objecterror.getDefaultmessage ()); } вернуть новый ответв (httpstatus.bad_request.value (), "parameter pelly", списки); } вернуть New Recasonvo (httpstatus.ok.value (), "bodypost", null);}1.2 Содержание проверки объекта (VO)
@Valid + BindingResult имеет много аннотаций проверки, и вы можете найти его, как только вы коснетесь онлайн!
открытый класс testvo {@getter @setter @min (value = 0, message = "Параметр запроса Issstring не может быть меньше 0") частное целое число; @Getter @Setter @NotBlank (message = "Параметр запроса Issstring не может быть пустой") частная строка Isstring;}1.3 Тест результатов
2. AOP -проверка (обновленная версия)
Можно видеть, что если необходимо проверять несколько тел, как кузов, то необходимо непрерывно воспроизводить кусок кода. Даже если он будет изменен на метод многократного использования родительского класса, он должен быть вызван. Поэтому я все еще чувствую, что это не элегантно, думая об этом. Таким образом, есть AOP для проверки раздела.
2.1 Внутренний слой (ИДАЛ)
Да! Вы правильно прочитали, приведенный выше код исчезает, и нет необходимости вызывать общий метод родительского класса. Только одна аннотация сделана: @paramvalid
@Paramvalid@responsebody@postmapping ("body") public responsevo bodypost (@requestbody @valid testvo body, bindingresult result) {return new responsevo ("bodypost", null);}2.2 Пользовательская аннотация
Эта аннотация также является простой аннотацией метода.
@Target (elementType.method) @retention (armentpolicy.runtime) public @Interface paramvalid {}2.3 Ключевые моменты! Аспект реализации
Подробное объяснение раздела:
@Before: используйте метод аннотации @annotation (xx), этот метод будет вызывать всякий раз, когда вы используете желаемую аннотацию (@paramvalid).
JOINPOINT: Получите параметры метода через JoinPoint, чтобы получить содержание, проверенное с помощью BindingResult
Мигрировать пакет проверки: переносить исходную проверку в аспект: validrequestparamss
Результаты проверки ответа:
@Ampost@ComponentPublic Class Paramvalidaspect {private Static Final Logger log = loggerFactory.getLogger (paramvalidaspect.class); @Before ("@annotation (paramvalid)") public void paramvalid (точка joinpoint, paramvalid paramvalid) {object [] paramobj = point.getargs (); if (paramobj.length> 0) {if (paramobj [1] exanceOf bindingResult) {bindingResult result = (bindingResult) paramobj [1]; Responsevo errorrormap = this.validrequestparams (результат); if (errormap! = null) {ServletRequestattributes res = (servletRequestattributes) requesteCpoNtextholder.getRequestattributes (); Httpservletresponse response = res.getResponse (); response.setcharacterencoding ("UTF-8"); response.setContentType (mediaType.application_json_utf8_value); response.setStatus (httpstatus.bad_request.value ()); OutputStream output = null; try {output = response.getOutputStream (); errormap.setcode (null); String error = new gson (). Tojson (errormap); log.info ("AOP -параметр нерегулярно обнаружен" + ошибка); output.Write (error.getBytes ("UTF-8")); } catch (ioException e) {log.error (e.getMessage ()); } наконец {try {if (output! = null) {output.close (); }} catch (ioException e) {log.error (e.getMessage ()); }}}}}}}} / *** verification* / private responsevo valyRequestparams (bindingResult result) {if (result.haserrors ()) {list <objecterror> allerrors = result.getAllorRors (); List <string> lists = new ArrayList <> (); for (objecterror objecterror: allerrors) {lists.add (objecterror.getDefaultmessage ()); } вернуть новый ответв (httpstatus.bad_request.value (), "parameter pelly", списки); } return null; }}2.4 Результаты испытаний
После прочтения двух вышеупомянутых результатов вы можете сравнить преимущества использования Spring AOP с @Valid + BindingResult для проверки:
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.