Spring MVC SessionAttribute未在所有控制器中初始化(Spring Boot 1.4.2)

时间:2016-12-04 14:45:26

标签: spring-mvc spring-boot

我对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语言编写的。

1 个答案:

答案 0 :(得分:0)

我发现:)

我必须将方法参数标记为ModelAttribute而不是SessionAttribute。