Я пытаюсь обновить контроллер Spring, чтобы использовать аннотации для относительно простой страницы «Смена пароля». Единственными полями на странице являются «пароль» и «подтвердить пароль». Когда форма отправлена, она обращается к веб-сервису для фактической смены пароля. Этот веб-сервис может возвращать исключение InvalidPasswordException, основанное на правилах паролей, выполняемых в этой службе. Поэтому я хочу перехватить исключение, а затем добавить сообщение об ошибке в представление рядом с полем «пароль». Код скорости уже написан с использованием #springShowErrors, поэтому я хочу добавить ошибку так, чтобы ее можно было прочитать по этому тегу.
Вот мой контроллер:
@Controller
@RequestMapping("/edit-password.ep")
public class EditPasswordFormControllerImpl {
@Autowired
private CustomerService customerService;
@Autowired
private CustomerSessionService customerSessionService;
@RequestMapping(method = RequestMethod.POST)
protected ModelAndView onSubmit(@ModelAttribute("editPasswordFormBean") EditPasswordFormBeanImpl editPasswordFormBean, BindingResult errors, HttpServletRequest request) throws EpWebException {
String nextView = "redirect:/manage-account.ep";
final CustomerSession customerSession = (CustomerSession) request.getSession().getAttribute(WebConstants.CUSTOMER_SESSION);
final Customer customer = customerSession.getShopper().getCustomer();
try {
CustomerInfo customerInfo = new CustomerInfo();
customerInfo.setCustomerId(customer.getUserId());
customerInfo.setPassword(editPasswordFormBean.getPassword());
UpdateAccountServiceRequest updateRequest = new UpdateAccountServiceRequest();
updateRequest.setClientId(CLIENT_ID);
updateRequest.setCustomerInfo(customerInfo);
//this is the webservice call that could throw InvalidPasswordException
customerService.updateUserAccount(updateRequest);
} catch (InvalidPasswordException e) {
// This is where I'm not sure what to do.
errors.addError(new ObjectError("password", e.getMessage()));
nextView = "edit-password.ep";
} catch (ServiceException e) {
throw new EpWebException("Caught an exception while calling webservice for updating user", e);
}
return new ModelAndView(nextView);
}
@RequestMapping(method = RequestMethod.GET)
protected String setupForm(ModelMap model) {
EditPasswordFormBean editPasswordFormBean = new EditPasswordFormBeanImpl();
model.addAttribute("editPasswordFormBean", editPasswordFormBean);
return "account/edit-password";
}
}
А вот фрагмент моего шаблона скорости:
<fieldset>
<legend>#springMessage("editPassword.editPasswordTitle")</legend>
<table border="0" cellspacing="0" cellpadding="3">
<colgroup>
<col width="150">
<col width="*">
</colgroup>
<tr>
<td colspan="2">
<br />
<strong>#springMessage("editPassword.changePassword")</strong>
</td>
</tr>
<tr>
<td align="right">#springMessage("editPassword.password")</td>
<td>
#springFormPasswordInput("editPasswordFormBean.password" "maxlength='100'")
#springShowErrors("<br>" "req")
</td>
</tr>
<tr>
<td align="right">#springMessage("editPassword.confirmPassword")</td>
<td>
#springFormPasswordInput("editPasswordFormBean.confirmPassword" "maxlength='100'")
#springShowErrors("<br>" "req")
</td>
</tr>
</table>
</fieldset>
Я не совсем уверен, что мне делать, когда я поймаю исключение. То, что у меня сейчас есть, не работает. Возвращается на страницу редактирования пароля, но не отображается сообщение об ошибке. Я читал о HandleExceptionResolver, но даже если я его использую, я все еще не уверен, как заставить ошибку отображаться в представлении.
Любая помощь очень ценится!