我開發了一個用於學習目的的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. Scala集合串
- 4. jsf forEach在集合
- 5. 鍵入Scala集合
- 6. 毀林Scala集合
- 7. 擴展Scala集合
- 8. 有效地Scala的集合
- 9. 翻轉Scala的位集合
- 10. 如何在Scala中生成一組集合的功率集合
- 11. 覆蓋Scala集合中的toString
- 12. Scala 2.9和Actor中的並行集合
- 13. 理解scala中的列表/集合
- 14. Scala中的有限稀疏集合
- 15. Scala:集合中的連續id
- 16. scala集合中的subsetOf在哪裏?
- 17. jsf使用集合/ map
- 18. 在jsf中設置集合屬性
- 19. Scala集合流程圖
- 20. 上`Scala集合(2.10.0-RC2)
- 21. 擴展一個Scala集合
- 22. scala 2.8集合不一致?
- 23. 在Scala中合併巨集(HashSet)
- 24. 集合在Scala中,如何讓地圖
- 25. 從scala集合中檢索生成器
- 26. 在Scala中迭代Java集合
- 27. 在C#中實現Scala集合?
- 28. Scala:如何合併地圖集合
- 29. Scala的類型類派生的集合
- 30. 位集合的內存使用Scala的
我不知道JSF,但不是[standart conversion methods](http://stackoverflow.com/questions/495741/iterating-over-java-collections-in-scala)不適用? –