2

私は現在、JSFでScalaを使用していますが、この2つは非常にうまく連携しています。ただし、JSFは、リストなどのデータ構造を(Class.newInstanceを介して)再インスタンス化する必要がある場合があります。たとえば、マネージドBeanでは、次のようになります。

@BeanProperty
var countries: java.util.List[String] = List("US").asJava

これは、java.lang.InstantiationExceptionが発生するJSFのプロセス検証フェーズに到達するまで正常に機能します。

java.lang.InstantiationException: scala.collection.JavaConversions$SeqWrapper
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at com.sun.faces.renderkit.html_basic.MenuRenderer.createCollection(MenuRenderer.java:906)
at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValuesForModel(MenuRenderer.java:366)
at com.sun.faces.renderkit.html_basic.MenuRenderer.convertSelectManyValue(MenuRenderer.java:128)
at com.sun.faces.renderkit.html_basic.MenuRenderer.getConvertedValue(MenuRenderer.java:314)
at org.primefaces.component.selectcheckboxmenu.SelectCheckboxMenuRenderer.getConvertedValue(SelectCheckboxMenuRenderer.java:34)
...

基本的なレベルから、ラッパーが最初から再インスタンス化されない可能性があることは理にかなっているため、JavaConvertersの使用はここではうまく機能しません。私の質問は、ラッパーなしで完全なデータ構造マッピング/変換をすでに提供しているライブラリがありますか?そうでなければ、私は自分の内部のものを書くだけです。

4

1 に答える 1

4

JavaArrayListを として使用し、コードで/をvar使用して操作します。これは、Java コレクションを必要とする Hibernate、JAX-WS、JSR-303 などの API に対して私が使用する通常のアプローチです。JavaConvertersJavaConversions

import collection.JavaConversions._

@BeanProperty
var countries: java.util.List[String] = new java.util.ArrayList[String] += "US"

また

import collection.JavaConverters._

@BeanProperty
var countries: java.util.List[String] = new java.util.ArrayList[String]
countries.asScala += "US"
countries.asScala ++= List("US", "MX")

ラップせずに前後に変換したい場合は、独自のクラスを作成しなくても十分簡単です。

import collection.JavaConverters._
import collection.mutable.ArrayBuffer

@BeanProperty
var countries: java.util.List[String] = new java.util.ArrayList[String]

val countriesBuff = new ArrayBuffer.empty[String]
countriesBuff ++= countries.asScala     // Convert from ArrayList to ArrayBuffer
// ...
countries.addAll(countriesBuff.asJava)  // Convert the other direction

ただし、コピーのコストと、同期がいつ必要になるかについて心配する必要があります。ラッピング/デコレーションがさらに便利に。

于 2012-12-19T03:45:10.497 に答える