2013-04-02 3 views
0

У меня есть портал, который сочетает в себе контроллеры Spring с несколькими регулярными сервлетами.Spring redirect после сервлета вперед не проходящая модель

На экране пользователь имеет список, из которого он/она выбирает кредитную карту, чтобы видеть отчет о транзакциях этой карты. В качестве дополнительной меры безопасности я не отправляю кредитную карту в любой запрос клиенту, поэтому у меня есть список номеров кредитных карт, замаскированных, которые я отправляю пользователю, и в запросе, отправленном пользователем. Я получаю идентификатор записи, который я использую для определения того, какая кредитная карта запрашивает.

В контроллере (ReportController), у меня есть метод, который обработать этот вход и вызов (локально) сервлет отвечает за обработку отчета (ReportServlet). Если в обработке есть какая-либо ошибка, она должна вернуть ее на экран с помощью модели param «ошибка». Эта последняя часть не работает.

Если есть ошибка в ReportServlet, она не возвращается на экран. Если я прокомментирую прямую линию (и заставляю ошибку), она работает, но после выполнения пересылки это не так. Что я делаю неправильно?

Вот код:

ReportController

try { 
       ... 

       if (cardholders == null || cardholders.size() < 2 || id <= 0) { 
        model.put("error","there's an error"); 
        return CARDTRANSACTIONS_PATH; 
       } else { 
... 
        HttpUpdatetableRequestWrapper customRequest = new HttpUpdatetableRequestWrapper(request); 
        customRequest.setParameter("cardnumber", cardholder.getCardnumber()); 

        request.getRequestDispatcher(config.getProperty("reportservlet")).forward((HttpServletRequest) customRequest, response); 
        String error = (String) session.getAttribute("error"); 
        if(!(error == null || "".equals(error))){ 
         throw new RuntimeException(error);       
        } 
       } 
      } catch (Exception ex) { 
       model.put("error", "there's an error"); 
      } finally{ return CARDTRANSACTIONS_PATH;} 
+1

Если вы собираетесь пересылать, вы должны вернуть форму 'null' вместо своего контроллера, а не' CARDTRANSACTIONS_PATH', который я предполагаю, является некоторой строкой. –

ответ

1

Когда ваш контроллер возвращается, весна даст модель на AbstractView которая будет разлагать его и передать атрибуты к запросу. Поэтому, когда вы добавляете атрибуты к объекту модели в своем контроллере, вы добавляете их только к карте без отношения к запросу. Если вы хотите, чтобы эти атрибуты были доступны для вашего ресурса, вы должны добавить их непосредственно в запрос.

При пересылке вы ожидаете, что ресурс, который вы пересылаете, обрабатывает ответ, поэтому вы должны сделать свой контроллер возвратом null в этой ситуации, чтобы он не делал дальнейшей обработки.

+0

спасибо. Простое и замечательное объяснение. –

 Смежные вопросы

  • Нет связанных вопросов^_^