Автор оригинала: Eugen Paraschiv.
1. Обзор
В последних нескольких статьях серии регистрации здесь , на Baeldung, мы построили большую часть необходимой нам функциональности в стиле MVC.
Теперь мы собираемся перевести некоторые из этих API на более спокойный подход.
2. Операция Регистрации
Давайте начнем с основной операции с регистром:
@PostMapping("/user/registration") public GenericResponse registerUserAccount( @Valid UserDto accountDto, HttpServletRequest request) { logger.debug("Registering user account with information: {}", accountDto); User registered = createUserAccount(accountDto); if (registered == null) { throw new UserAlreadyExistException(); } String appUrl = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); eventPublisher.publishEvent( new OnRegistrationCompleteEvent(registered, request.getLocale(), appUrl)); return new GenericResponse("success"); }
Итак, как это отличается от первоначальной реализации, ориентированной на MVC?
Вот так:
- теперь запрос правильно сопоставлен с HTTP-сообщением
- теперь мы возвращаем правильный DTO и сортируем его непосредственно в тело ответа
- мы больше не имеем дело с обработкой ошибок в методе вообще
Мы также удаляем старую showRegistrationPage() – поскольку это не нужно для простого отображения страницы регистрации.
3. registration.html
С учетом этих изменений нам теперь необходимо изменить registration.html к:
- используйте Ajax для отправки регистрационной формы
- получите результаты операции в формате JSON
Вот так:
form
4. Обработка исключений
Наряду с более спокойным API, логика обработки исключений, конечно, также станет более зрелой.
Мы используем один и тот же механизм @ControllerAdvice для чистой обработки исключений, создаваемых приложением, – и теперь нам нужен новый тип исключений.
Это исключение BindException – которое возникает при проверке UserDTO (если оно неверно). Мы переопределим по умолчанию ResponseEntityExceptionHandler метод handleBindException () , чтобы добавить ошибки в тело ответа:
@Override protected ResponseEntity
Нам также нужно будет обработать наше пользовательское Исключение | UserAlreadyExistException – которое возникает, когда пользователь регистрируется по электронной почте, которая уже существует:
@ExceptionHandler({ UserAlreadyExistException.class }) public ResponseEntity
5. Общий Ответ
Нам также необходимо улучшить реализацию Generic Response , чтобы избежать этих ошибок проверки:
public class GenericResponse { public GenericResponse(ListfieldErrors, List globalErrors) { super(); ObjectMapper mapper = new ObjectMapper(); try { this.message = mapper.writeValueAsString(fieldErrors); this.error = mapper.writeValueAsString(globalErrors); } catch (JsonProcessingException e) { this.message = ""; this.error = ""; } } }
6. UI – Поле и глобальные ошибки
Наконец, давайте посмотрим, как обрабатывать как полевые, так и глобальные ошибки с помощью jQuery:
var serverContext = [[@{/}]]; function register(){ $(".alert").html("").hide(); var formData= $('form').serialize(); $.post(serverContext + "/user/registration",formData ,function(data){ if(data.message == "success"){ window.location.href = serverContext +"/successRegister.html"; } }) .fail(function(data) { if(data.responseJSON.error.indexOf("MailError") > -1) { window.location.href = serverContext + "/emailError.html"; } else if(data.responseJSON.error.indexOf("InternalError") > -1){ window.location.href = serverContext + "/login.html?message=" + data.responseJSON.message; } else if(data.responseJSON.error == "UserAlreadyExist"){ $("#emailError").show().html(data.responseJSON.message); } else{ var errors = $.parseJSON(data.responseJSON.message); $.each( errors, function( index,item ){ $("#"+item.field+"Error").show().html(item.defaultMessage); }); errors = $.parseJSON(data.responseJSON.error); $.each( errors, function( index,item ){ $("#globalError").show().append(item.defaultMessage+"
"); }); } }
Обратите внимание, что:
- Если есть ошибки проверки – то объект message содержит ошибки полей, а объект error содержит глобальные ошибки
- Мы показываем каждую ошибку поля рядом с его полем
- Мы показываем все глобальные ошибки в одном месте в конце формы
7. Заключение
Цель этой краткой статьи-перевести API в более спокойное русло и показать простой способ работы с этим API в интерфейсе.
Сам интерфейс jQuery не является фокусом – просто базовый потенциальный клиент, который может быть реализован в любом количестве фреймворков JS, в то время как API остается точно таким же.
полную реализацию этого учебника можно найти в проекте github – это проект на основе Eclipse, поэтому его должно быть легко импортировать и запускать как есть.