在Spring MVC中,如何指定RequestMapping依赖于session属性?

时间:2017-09-10 15:20:18

标签: java spring spring-mvc

为了回应某些客户的要求,我想写两种不同的方法,但似乎无法做到这一点...... 我希望两种方法都映射到相同的请求模式,但是两种方法之间的区别在于,我希望在某个属性在会话中时调用一个,而另一个在属性不在会话。

在我的第一次尝试中,我写了一个处理这两种情况的方法:

@RequestMapping(<some pattern>)
public ModelAndView loadData( @SessionAttribute("data") Data data, 
           @RequestParam("action") String action) {
    if (data == null) {
       Data data = new Data();
       session.setAttribute("data", data);
    }
    //additional processing using data
    return ...
}

但是,当请求没有属性Data时,Spring无法将其映射到上面的方法,并且记录它将是那样...

因此,在我的第二次尝试中,我使用相同的请求映射创建了两个不同的方法,但具有不同的签名:

//i want this method to be called when Data in NOT in the session. 
//this methods creates the Data object and sets it into the session
@RequestMapping(<some pattern>)
public ModelAndView loadDataNew( HttpSession session, @RequestParam("action") String action) {
    Data data = new Data();
    session.setAttribute("data", data);
    return loadData(data, action);
}

//i want this method to be called when Data IS in the session. 
//this methods maps that Data object from the session into the parameter Data
@RequestMapping(<some pattern>)
public ModelAndView loadDataContinue( @SessionAttribute("data") Data data, 
           @RequestParam("action") String action) {        
    return loadData(data, action);
}
private ModelAndView loadData( Data data, String action) {        
    //additional processing
    return ...
}

但这对Spring来说是有问题的,它抱怨:&#34;模糊映射&#34;,可能是因为它们都有相同的请求映射。

这是Spring中的错误吗?我希望它知道如何根据方法参数映射到正确的方法(因为在第一种情况下,Data参数为null,这是不允许的,所以Spring应该知道使用第二种匹配方法)...

有没有办法让Spring将会话映射到方法参数,但只有它存在? 我可以拥有一个获取或设置数据的方法签名,如:

@RequestMapping(<some pattern>)
    public ModelAndView loadDataNew( HttpSession session, @RequestParam("action") String action) {
        Data data = session.getAttibute("data");
        if (data == null) {
            data = new Data();
            session.setAttribute("data", data);
        }
        //additional processing using data
        return ...
    }

但我希望使用Spring的映射获得更优雅的解决方案...... (我可能会引入一个新的请求参数,映射将基于它(或它的存在),但这不是很优雅)

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:“有没有办法让Spring将会话映射到方法参数,但只有它存在?”

经过一些基于M. Deinum暗示的研究后,事实证明我可以使用我在第一次尝试中尝试的方法(如问题所述)。我需要的唯一东西(这就是我在答案中寻找的)是可选会话参数注释中的“value =”和“required = false”:

@RequestMapping(<some pattern>)
public ModelAndView loadData( @SessionAttribute(value="data", required=false) Data data, 
           @RequestParam("action") String action) {
    if (data == null) {
       Data data = new Data();
       session.setAttribute("data", data);
    }
    //additional processing using data
    return ...
}