我对SessionAttribute有一种奇怪的行为。 我已经定义了一个名为nafSelection的SessionAttribute,用于2个控制器:NafController和StatsController。
当我通过NafController时,会创建SessionAttribute并且StatsController可以使用它。如果首先,我使用StatsController我有一个错误“缺少类型NafSelection的会话属性'nafSelection'。”
为了共享模型属性,我编写了一个ControllerAdvice:
@ControllerAdvice('com.dyndata.sirene.controllers')
class ModelAdvice {
@ModelAttribute("nafSelection")
NafSelection newSelection() {
new NafSelection()
}
}
我在2个控制器中声明了session属性:
@Controller
@SessionAttributes("nafSelection")
class NafController {
private static Logger logger = Logger.getLogger(NafController.class.name);
@RequestMapping('/naf')
def naf() {
'naf'
}
@RequestMapping(path = '/naf/{nafCode}', method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ResponseBody
def affNafCode(@PathVariable String nafCode, @SessionAttribute NafSelection nafSelection) {
logger.info("Adds the NAF " + nafCode)
nafSelection.nafs << nafCode
return new Counter(count: 5600)
}
@RequestMapping(path = '/naf/{nafCode}', method = RequestMethod.DELETE)
@ResponseBody
def delNafCode(@PathVariable String nafCode, @SessionAttribute NafSelection nafSelection) {
logger.info("Deletes the NAF " + nafCode)
nafSelection.nafs.remove(nafCode)
return new Counter(count: 80000)
}
}
第二个控制器:
@Controller
@SessionAttributes("nafSelection")
class StatsController {
private static Logger logger = Logger.getLogger(StatsController.class.name);
@RequestMapping(path = '/stats')
def stats(@SessionAttribute NafSelection nafSelection) {
'stats'
}
}
为什么会话属性由NafController管理,而不是由StatsController管理?
注意:我的代码是用Groovy语言编写的。
答案 0 :(得分:0)
我发现:)
我必须将方法参数标记为ModelAttribute而不是SessionAttribute。