Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从JSP访问HashMultimap时出现异常的原因是什么_Java_Spring_Jsp_Guava - Fatal编程技术网

Java 从JSP访问HashMultimap时出现异常的原因是什么

Java 从JSP访问HashMultimap时出现异常的原因是什么,java,spring,jsp,guava,Java,Spring,Jsp,Guava,我有一个SpringMVC控制器,它向scope/model添加了一个GuavaHashMultimap。然后JSP读取该数据结构以显示每个应用程序的角色列表: 在控制器中: HashMultimap<Long,Role> rolesByApp = HashMultimap.create(); //... fill the multimap model.addAttribute("rolesByApp", rolesByApp); 这种情况并非总是发生,在我的开发机器(Mac)上可

我有一个SpringMVC控制器,它向scope/model添加了一个Guava
HashMultimap
。然后JSP读取该数据结构以显示每个应用程序的角色列表:

在控制器中:

HashMultimap<Long,Role> rolesByApp = HashMultimap.create();
//... fill the multimap
model.addAttribute("rolesByApp", rolesByApp);
这种情况并非总是发生,在我的开发机器(Mac)上可能有四分之三的情况。在服务器上,它一直工作正常(Red Hat Linux)。它过去在我的开发机器上也可以很好地工作,在我开发它的时候,我使用的是Win7

如果我将
HashMultimap
替换为
HashMap
,它也可以正常工作


我不理解这个错误。原因可能是什么?

在仍然使用
MultiMap
构建数据结构时,我暴露了它的
Map
视图,而不是
MultiMap
本身:

model.addAttribute("rolesByApp", rolesByApp.asMap());
在JSP中,我替换了

<c:set var="appRoles" value="${rolesByApp.get(app.id)}"/>


这修复了错误


我仍然不知道上次错误的原因。如果有人能重现并解释错误,我将接受答案。否则,我最终会接受我自己的解决方法。

请记住,
com.google.common.collect.Multimap
不会实现
java.util.Map

因此,JSTL表达式语言不支持Multimap,除非您在与Servlet 3.0兼容的容器中运行代码。声明,如果应用JSTL表达式的对象既没有实现java.util.List也没有实现java.util.Map,则JSTL需要一个符合JavaBean标准的getter


这意味着对于Servlet 2和更低版本,您必须在将多映射转换为“普通”映射之前,将其交给JSP,以便使用JSTL表达式访问该映射。

代码使用反射来访问该方法。由于它经常工作,并且只在Mac上工作,因此问题可能与JDK实现有关。我想目前的问题是由这个JDK的安全管理器引起的。尝试安装OpenJDK(顺便说一下,您使用的是什么JDK)并使用不同的JDK,如果问题仍然存在,请重试

如果第二个JDK没有引起问题,请尝试将问题最小化,直至可以重现问题,并使用visualVM或(远程)调试器访问和理解手头的问题。将您所拥有的一切发送给JDK开发团队,享受发现bug的乐趣

您还可以尝试使用自己的反射方法访问有问题的方法,并查看它是否也失败


有一个问题是有问题的,而这个问题不是基于表面上的随机属性

也许与此有关?@Tavian:虽然错误是相似的,但我不认为原因是相同的。在您指出的问题中,原因是访问私有内部类的成员。这里的情况并非如此。HashMultiMap的get()方法返回一个HashSet,它是标准的Java集合类。另外,我猜,在另一个问题中的错误会一直发生。这是有道理的,这就是我最终如何使它工作的。然而,对于和(部分参数化方法调用),由于Servlet3.0规范,您可以使用EL从JSP调用包括参数在内的任何方法。至少我是这样理解的。而且我发布的代码大部分时间也有效。如果这是一个不受支持的操作,我想它永远不会工作。谢谢你-好点-我已经相应地更新了我的答案。它实际上只在Mac上失败:)无论如何,它是一样的。这很可能是JDK so+1的一个bug。我在Mac、Win和Linux上使用Oracle的JDK 8。但我必须承认,我觉得现在做所有的测试有点懒,特别是因为我有一个几乎更干净的工作环境。也许当我有时间的时候,现在不是周末,我从那该死的感冒中恢复过来;-)好的。最好是安装OpenJDK,然后再试一次。由于Mac在运行服务器时几乎不重要,所以社区可能会在你的懒惰中生存:-)。上次我查看时,我找不到OpenJDK 8。有吗?是的,但在openJDK.java.net的主页上仍然写着:“下载并安装最流行的Linux发行版的开源JDK 7。如果您来这里寻找用于Solaris、Linux、Mac OS X或Windows的Oracle JDK 8产品二进制文件,它们基本上基于相同的代码,您可以从java.Oracle.com下载。”:-/有趣。我也没拿到。我在两天前为linux安装了OracleJDK8。也许他们已经放弃了这个计划。好奇。
model.addAttribute("rolesByApp", rolesByApp.asMap());
<c:set var="appRoles" value="${rolesByApp.get(app.id)}"/>
<c:set var="appRoles" value="${rolesByApp[app.id]}"/>