我通过注释使用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对象。有没有更好的方法来做到这一点,我可以摆脱这个问题? 再次感谢。