Обработка ошибок вручную в аннотированном контроллере Spring - PullRequest
0 голосов
/ 13 марта 2012

Я пытаюсь обновить контроллер 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, но даже если я его использую, я все еще не уверен, как заставить ошибку отображаться в представлении.

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 13 марта 2012

Джефф, это просто предположение, если вы видите контроллер, у вас есть RequestMapping ("/ edit-password.ep"), поэтому при возникновении сценария ошибки ваш следующий вид - "edit-password.ep", поэтому он придет к этому контроллеру и будет обработан как запрос get к контроллеру. Но в вашем методе отображения GET вы всегда создаете новый EditPasswordBean и отправляете обратно. Если вы запускаете сервер в режиме отладки и сохраняете точку останова в методе setUpForm, вы поймете, почему ошибки были проглочены. Старайтесь давать конкретные сопоставления для получения и публикации, чтобы избежать таких проблем. В идеале вы должны определить Validator, и он должен быть зарегистрирован в вашем методе initBinder. Проверьте эту ссылку http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...