我开发了一个用于学习目的的Scala和JSF应用程序。在这个应用程序中,我必须将所有我的Scala集合对象转换为Java cllectios,然后才能在JSF中呈现它。有没有什么简单的方法可以用ScalaElResolver来实现,如果是的话,任何人都有ScalaElResolver的示例代码。 在前提前致谢 PhilipJSF中的Scala集合
回答
此代码基于Werner Punz的ScalaElResolver。 我已经剥离下来,所以它只是处理来自斯卡拉Iterable
到java.lang.Iterable
转换:
class SimpleScalaElResolver extends ELResolver {
override def getValue(elContext: ELContext, base: AnyRef,
prop: AnyRef): AnyRef = {
println(s"SimpleElResolver: getValue: Entering: $base.$prop")
if (base == null) {
null
} else {
val method = base.getClass.getDeclaredMethod(prop.toString)
if (method != null) {
val res = method.invoke(base)
if (res.isInstanceOf[Iterable[_]]) {
val iter = res.asInstanceOf[Iterable[_]]
println("getValue: Wrapping as Java iterable")
elContext.setPropertyResolved(true)
JavaConversions.asJavaIterable(iter)
} else {
null
}
} else {
null
}
}
}
这足以让它运行使用sbt
及其web插件(使用jetty
引擎盖下)即使所有其他方法仍“未执行”,如下所示:
override def getCommonPropertyType(elContext: ELContext, o: AnyRef): Class[_] = {
???
}
其他方法在我的情况下未被调用。
我已经从.jspx
中测试过;据我所知,这也应该与JSF
一起工作。
例如:如果你有一个类
class Model(val list: List[Int])
,并在控制器
val model = new Model(List(1))
httpRequest.setAttribute("model", model)
您可以在EL
<ul>
<c:forEach var="i" items="${ model.list }">
<li>
<c:out value="${ i }"/>
</li>
</c:forEach>
</ul>
所以属性名访问对象在EL完全匹配th的名字e val
在您的模型类中。否则你会得到一个java.lang.NoSuchMethodException
。
非常感谢您的快速响应。 –
我得到一个异常警告:StandardWrapperValve [面临的Servlet]:Servlet.service()进行的servlet面临的Servlet抛出异常 java.lang.NoSuchMethodException:com.sun.faces.context.FacesContextImpl.externalContext() \t是java。 lang.Class.getDeclaredMethod(Class.java:1956) \t在com.philipj.scala.web.booking.ScalaElResolver.getValue(ScalaElResolver.scala:18) \t在com.sun.faces.el.DemuxCompositeELResolver._getValue( DemuxCompositeELResolver.java:176) \t at com.sun.faces.el.DemuxCompositeELResolver。 –
@PhilipJ我给答案增加了一个例子。请检查这是否解决您的问题。 – Beryllium
嗨,我刚刚在github上打开了一个scalaelresolver项目,https://github.com/werpu/scalaelresolver解析器除了解析scala属性还有集合转换。包括一个例子。
包括所有权披露,因此不是垃圾邮件。 – hexafraction
- 1. Scala中的排序集合
- 2. Scala集合串
- 3. jsf forEach在集合
- 4. 扩展Scala集合
- 5. 键入Scala集合
- 6. 毁林Scala集合
- 7. 有效地Scala的集合
- 8. 翻转Scala的位集合
- 9. 如何在Scala中生成一组集合的功率集合
- 10. scala集合中的subsetOf在哪里?
- 11. 理解scala中的列表/集合
- 12. 覆盖Scala集合中的toString
- 13. Scala 2.9和Actor中的并行集合
- 14. jsf使用集合/ map
- 15. scala 2.8集合不一致?
- 16. 扩展一个Scala集合
- 17. 上`Scala集合(2.10.0-RC2)
- 18. 在jsf中设置集合属性
- 19. 在Scala中迭代Java集合
- 20. 集合在Scala中,如何让地图
- 21. 从scala集合中检索生成器
- 22. 在C#中实现Scala集合?
- 23. 在Scala中合并巨集(HashSet)
- 24. Scala:如何合并地图集合
- 25. 位集合的内存使用Scala的
- 26. scala如何交集和匹配集合中的元素
- 27. Java - > Scala,关于集合的表演
- 28. scala排序某一类的集合
- 29. 意外的Scala集合记忆行为
- 30. 定制Scala集合的测试套件?
我不知道JSF,但不是[standart conversion methods](http://stackoverflow.com/questions/495741/iterating-over-java-collections-in-scala)不适用? –