Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在SpringMVC中,如何指定RequestMapping依赖于会话属性?_Java_Spring_Spring Mvc - Fatal编程技术网

Java 在SpringMVC中,如何指定RequestMapping依赖于会话属性?

Java 在SpringMVC中,如何指定RequestMapping依赖于会话属性?,java,spring,spring-mvc,Java,Spring,Spring Mvc,为了响应特定的客户端请求,我想编写两种不同的方法,但似乎无法做到这一点。。。 我希望这两个方法都映射到相同的请求模式,但是这两个方法之间的区别在于,我希望在会话中有某个属性时调用一个方法,而在会话中没有该属性时调用另一个方法 在我的第一次尝试中,我编写了一个处理这两种情况的方法: @RequestMapping(<some pattern>) public ModelAndView loadData( @SessionAttribute("data") Data data,

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

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

@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 ...
}
@RequestMapping()
公共模型和视图加载数据(@SessionAttribute(“数据”)数据,
@RequestParam(“操作”)字符串(操作){
如果(数据==null){
数据=新数据();
session.setAttribute(“数据”,数据);
}
//使用数据的附加处理
返回。。。
}
但是,当请求没有属性数据时,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 ...
}
//我希望在数据不在会话中时调用此方法。
//此方法创建数据对象并将其设置到会话中
@请求映射()
public ModelAndView loadDataNew(HttpSession会话,@RequestParam(“操作”)字符串操作){
数据=新数据();
session.setAttribute(“数据”,数据);
返回加载数据(数据、动作);
}
//我希望在会话中有数据时调用此方法。
//此方法将会话中的数据对象映射到参数数据中
@请求映射()
公共模型和视图加载数据继续(@SessionAttribute(“数据”)数据,
@RequestParam(“操作”)字符串操作){
返回加载数据(数据、动作);
}
私有模型和视图加载数据(数据数据,字符串操作){
//附加处理
返回。。。
}
但这对Spring来说是个问题,它抱怨说:“映射不明确”,可能是因为它们都有相同的请求映射

这是春天的虫子吗?我希望它知道如何根据方法参数映射到正确的方法(因为在第一种情况下,数据参数为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 ...
    }
@RequestMapping()
public ModelAndView loadDataNew(HttpSession会话,@RequestParam(“操作”)字符串操作){
数据=session.getAttibute(“数据”);
如果(数据==null){
数据=新数据();
session.setAttribute(“数据”,数据);
}
//使用数据的附加处理
返回。。。
}
但我希望用Spring的映射得到一个更优雅的解决方案。。。
(我可能会引入一个新的请求参数,映射将基于它(或它的存在),但这不是很优雅)

回答我自己的问题:“有没有办法让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 ...
}
@RequestMapping()
公共模型和查看加载数据(@SessionAttribute(value=“data”,required=false)数据,
@RequestParam(“操作”)字符串(操作){
如果(数据==null){
数据=新数据();
session.setAttribute(“数据”,数据);
}
//使用数据的附加处理
返回。。。
}

在启动时构建请求映射时,不考虑方法参数。所以不,这不是一个bug,这就是spring的工作原理。您可以在
@SessionAttribute
中指定
required
属性,该属性将允许您编写单个方法(并将为您保存一行代码)。如果您真的想要并且想要扩展SpringMVC的请求处理,您可以实现自己的
RequestCondition
,并扩展
RequestMappingHandlerMapping
,以对其进行操作。但这比自己创建一个分派方法要多得多。