У меня есть контроллер 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()
не имеет никакого эффекта.