Как я опускаю параметры ModelAttribute из ModelAndView, возвращаемого действием Spring 3 MVC? - PullRequest
3 голосов
/ 01 декабря 2011

У меня есть контроллер Spring MVC с действием, которое вызывается с использованием AJAX.

@SessionAttributes({"userContext"})
public class Controller
{
    ...
    @RequestMapping(value = "/my-url", method= { RequestMethods.POST })
    public ModelAndView doSomething(@ModelAttribute("userContext") UserContext context,
            SessionStatus sessionStatus)
    {
        BusinessObject obj = doSomeBusinessLogic(context.getUserName());
        sessionStatus.setComplete();
        ModelAndView mav = new ModelAndView("jsonView");
        mav.addObject("someInt", obj.getId());
        return mav;
    }
}

Когда я запускаю это действие, я получаю следующее исключение:

net.sf.json.JSONException: There is a cycle in the hierarchy!
at t.sf.json.util.CycleDetectionStrategy$StrictCycleDetectionStrategy.handleRepeatedReferenceAsObject(CycleDetectionStrategy.java:97)
at net.sf.json.JSONObject._fromBean(JSONObject.java:833)
at net.sf.json.JSONObject.fromObject(JSONObject.java:168)
at org.springframework.web.servlet.view.json.writer.jsonlib.PropertyEditorRegistryValueProcessor.processObjectValue(PropertyEditorRegistryValueProcessor.java:127)
at net.sf.json.JSONObject._fromMap(JSONObject.java:1334)
Truncated. see log file for complete stacktrace

После некоторой отладки я обнаружил, что Spring помещает объект UserContext в ModelAndView, который я возвращаю. Если я жестко закодирую свое имя пользователя и удаляю объект контекста из параметров метода, действие выполняется успешно. Есть ли способ настроить Spring, чтобы пропустить аннотированные параметры ModelAttribute из возвращенного ModelAndView? Как видите, sessionStatus.setComplete() не имеет никакого эффекта.

Ответы [ 3 ]

1 голос
/ 03 декабря 2011

У меня были подобные проблемы в прошлом с @SessionAttributes.Объявляя @SessionAttributes({"userContext"}), вы говорите Spring, что вы хотите, чтобы "userContext" всегда был доступен в модели, и поэтому у Spring нет иного выбора, кроме как отправить ваш UserContext объект в модель, на всякий случай, если вы собираетесьперенаправлять или делать что-то еще, что может закончиться другим Controller.

«Решением» (и мне это не очень понравилось, но оно работало) было опустить аннотацию @SessionAttributes вконтроллер, добавьте параметр HttpSession к необходимым методам и «вручную» управляйте тем, что в нем.

Мне интересно узнать, есть ли лучший способ, потому что кажется, что @SessionAttributes имеет огромный потенциал дляуберите код уровня контроллера.

0 голосов
/ 06 сентября 2012

Вместе с @ModelAttribute передайте @ModelMap в качестве аргумента метода.Основываясь на бизнес-логике, условиях ошибки - если вам не нужен атрибут для определенных сценариев, то удалите его с карты.

    public ModelAndView foo(@ModelAttribute("userContext") UserContext, @ModelMap map){
      if(success){
       return success.jsp
      }
      else{
       map.remove("userContext");
      return "error.jsp" 
      }
    }

Не полностью удовлетворен необходимостью также передать ModelMap, но яне нашел другого более простого способа сделать это.

Ура !!

0 голосов
/ 16 января 2012

Я зарегистрировал WebArgumentResolver, чтобы получить переменную сеанса.Это позволило мне исключить эту переменную сеанса из ответа, в то же время сохраняя возможность проверки моего модуля действия.

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