我正在使用Spring MVC框架构建Web应用程序。
我有一些控制器在我的视图中添加了一些属性(属于同一团队的用户),如下所示:
@RequestMapping(value = "/friends", method = RequestMethod.GET)
public ModelAndView showFriends(Principal principal) {
ModelAndView mav = new ModelAndView("friends");
User currentUser = userService.findUser(principal.getName());
// this method returns a Collection<long> of userIds from users that belong to a given team
Collection<long> userIds = findUsersFromTeam(currentUser.getTeam());
mav.addObject("users", userIds);
mav.addObject("currentUser", userService.findUsers();
return mav;
}
并且,在我的&#34; friends.jsp&#34;文件,我做了以下测试:
<c:when test="${users.contains(currentUser.id)}">
引发以下异常:
java.lang.NoSuchMethodException: java.util.ArrayList.contains(java.lang.Long)
但是,ArrayList
类实现了contains(Object o)
方法。怎么了?
答案 0 :(得分:4)
这只是EL解析方法表达式以及反射如何工作的结果
${users.contains(currentUser.id)}
它的类型为users
,ArrayList
,类型为currentUser.id
,Long
。然后,它使用反射来获取名为contains
的方法,其类型Long
上的参数类型为ArrayList
。它找不到一个,因为一个不存在。请记住,反射不会对参数列表元素应用继承层次结构检查。
所以即使有ArrayList#contains(Object)
,也没有ArrayList#contains(Long)
。因此它失败了。
不要使用基本的EL。编写自己的EL函数或在处理程序方法中执行逻辑。