为了回应某些客户的要求,我想写两种不同的方法,但似乎无法做到这一点...... 我希望两种方法都映射到相同的请求模式,但是两种方法之间的区别在于,我希望在某个属性在会话中时调用一个,而另一个在属性不在会话。
在我的第一次尝试中,我写了一个处理这两种情况的方法:
@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的映射获得更优雅的解决方案...... (我可能会引入一个新的请求参数,映射将基于它(或它的存在),但这不是很优雅)
答案 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 ...
}