使用contains()方法时出现奇怪的异常

时间:2014-06-24 17:13:23

标签: java spring collections el

我正在使用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)方法。怎么了?

1 个答案:

答案 0 :(得分:4)

这只是EL解析方法表达式以及反射如何工作的结果

${users.contains(currentUser.id)}

它的类型为usersArrayList,类型为currentUser.idLong。然后,它使用反射来获取名为contains的方法,其类型Long上的参数类型为ArrayList。它找不到一个,因为一个不存在。请记住,反射不会对参数列表元素应用继承层次结构检查。

所以即使有ArrayList#contains(Object),也没有ArrayList#contains(Long)。因此它失败了。

不要使用基本的EL。编写自己的EL函数或在处理程序方法中执行逻辑。