2013-07-05 35 views
1

我开发了一个用于学习目的的Scala和JSF应用程序。在这个应用程序中,我必须将所有我的Scala集合对象转换为Java cllectios,然后才能在JSF中呈现它。有没有什么简单的方法可以用ScalaElResolver来实现,如果是的话,任何人都有ScalaElResolver的示例代码。 在前提前致谢 PhilipJSF中的Scala集合

+0

我不知道JSF,但不是[standart conversion methods](http://stackoverflow.com/questions/495741/iterating-over-java-collections-in-scala)不适用? –

回答

3

此代码基于Werner Punz的ScalaElResolver。 我已经剥离下来,所以它只是处理来自斯卡拉Iterablejava.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

+0

非常感谢您的快速响应。 –

+0

我得到一个异常警告: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。 –

+0

@PhilipJ我给答案增加了一个例子。请检查这是否解决您的问题。 – Beryllium