在调用服务方法后,我的spring mvc会话被隐式更改了?

时间:2013-11-28 07:25:18

标签: spring session spring-mvc

我通过注释使用spring 3.2.5并遇到了处理会话的问题。

我的控制器类是这样的:

@Controller
public class WebController {
    @Autowired
    private IElementService elementService;
    ...

    //in this method I set the "elementList" in session explicitly
    @RequestMapping("/elementSearch.do")
    public String elementSearch(
        @RequestParam("keyword") String keyword,
        HttpSession session){
        List<Element> elementList= elementService.searchElement(keyword);
        session.setAttribute("elementList", elementList);
        return "searchResult";
    }

    //here I got my problem
    @RequestMapping(value="/anotherMethod.do", produces="text/html; charset=utf-8")
    @ResponseBody
    public String anotherMethod(
        ...
        //I called my service method here like
        Element e = elementService.searchElement("something").get(0);
        ...
    }

我有一个像这样的ElementServiceImpl类:

@Service
public class ElementServiceImpl implements IElementService {
    @Autowired
    private IBaseDAO baseDao;

    @Override
    public List<Metadata> searchElement(String keyword) {
        List<Metadata> re = baseDao.searchElement(keyword);
        return re;
    }
}

我有一个BaseDAOImpl类实现了IBaseDAO并使用@Repository进行了宣传:

@Repository
public class BaseDAOImpl implements IBaseDAO {
    ...
}

这是问题,当我访问“... / anotherMethod.do”时,会调用另一个方法,会话中的“elementList”被更改了! 然后我查看了anotherMethod()并且每次都找到了

Element e = elementService.searchElement("something").get(0);

被调用,我的elementList被更改为searchElement方法返回的新结果(返回List)。 但我没有在该方法中设置会话,而且我没有使用@SessionAttributes,所以我不明白在调用服务方法后我的会话属性怎么会改变?

这个问题现在让我折磨,所以任何建议都会有很大的帮助,谢谢!


更新:我试图围绕该方法调用打印所有会话属性,如下所示:

StringBuilder ss1 = new StringBuilder("-------------current session-------------\n");
session.setAttribute("test1", "test value 1");
log.info("sessionTest - key:test1  value:" + session.getAttribute("test"));
Enumeration<String> attrs1 = session.getAttributeNames();
while(attrs1.hasMoreElements()){
    String key = attrs1.nextElement();
    ss1.append(key).append(":").append(session.getAttribute(key)).append("\n");
}
log.info(ss1);

但我没看到“elementList”或我在打印之前添加的测试值。

我可以获得一些价值
List<Element> elementList = (List<Element>) session.getAttribute("elementList");

和elementList我在调用服务方法后得到改变,就像我之前发布的那样。我的elementList存储在哪里?不在会议中?

我的目标是向表中的用户显示elementList,让他们选择其中一个,然后我得到表的行号并将其作为elemntList的索引,所以我会知道哪个用户选择的elemnt对象。有没有更好的方法来做到这一点,我可以摆脱这个问题? 再次感谢。

0 个答案:

没有答案