ローカルのTomcatインスタンスで正常に実行されるアプリケーションがあります。これは、HectorをCassandraのクライアントライブラリとして使用するcassandraクライアントアプリです。アプリケーションは、次のようなコードを使用して、キースペースと列ファミリー(まだ存在しない場合)を作成します。
final ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition(keySpaceName,
columnFamilyName, ComparatorType.BYTESTYPE);
cfDef.setKeyValidationClass(ComparatorType.LONGTYPE.getClassName());
cfDef.setComparatorType(ComparatorType.UTF8TYPE);
cfDef.addColumnDefinition(new BasicColumnDefinition() {{
setName(StringSerializer.get().toByteBuffer("id"));
setValidationClass(ComparatorType.LONGTYPE.getClassName());
}});
これとまったく同じアプリケーションをCloudFoundry(単純なcassandraサービスがある独自の内部クラウド)にプッシュすると、上記の「addColumnDefinition」の行で例外が発生します。スタックトレースは次のとおりです。
java.lang.UnsupportedOperationException
java.util.AbstractList.add(Unknown Source)
java.util.AbstractList.add(Unknown Source)
me.prettyprint.cassandra.service.ThriftCfDef.addColumnDefinition(ThriftCfDef.java:311)
org.pvtl.cassandra.HectorSample.createColumnFamily(HectorSample.java:94)
org.pvtl.cassandra.HectorSample.<init>(HectorSample.java:37)
org.apache.jsp.index_jsp._jspService(index_jsp.java:61)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:388)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
たくさんのグーグルがあり、問題はHectorコードが不変のリスト(java.util.AbstractList)に追加しようとしていることのようです。しかし、繰り返しになりますが、そのコードはローカルのTomcatインスタンスで正常に実行されるため、jdkの違いを考えていますか?多分?私はjava7(sun)をローカルで実行していて、java 7を選択するようにプッシュしました。誰かアイデアはありますか?