如何在远程的会话bean类中使用ByteBuffer?

时间:2015-01-25 16:37:52

标签: java java-ee cassandra cql

我们正在使用cassandra来满足我们的一些数据需求。有一个column family(表格),其中有一列blob

根据datastax documentation,cql blob的数据类型为java.nio.ByteBuffer

我们有一个对象映射到cassandra表的类让我们说SampleEntity,它的定义如下

        @Table(name="sampletable", keyspace="main")
        public class SampleEntity{
             @Column("id")
             private UUID id;

             @Column("data")
             private ByteBuffer complexData;

             //...getters and setters
        }

我们有一个无状态会话bean类(远程ejb),它具有使用实体管理器将对象持久化到数据库的代码。该类实现了一个用@Remote(javax.ejb.Remote)注释的接口。

     @stateless
     public class SampleEntityBean implements SampleEntityBeanRemote{

         //inject entity manager
         .... SomeDatatype entityManager

         UUID createEntity(SampleEntity entity){
                 entityManager.persist(entity);
         }

     }

现在,我们在应用程序的许多地方使用SampleEntityBean,方法是使用@EJB注释注入它。因此,这意味着使用RMI底层远程调用此方法。

问题是ByteBuffer不可序列化,它由Unable to marshal ejb parameters引起Not serializable exception: java.nio.HeapByteBuffer

这意味着,一方面我需要ByteBuffer blob而另一方面我可能不会使用它,因为它不可序列化。

那么,有没有办法以标准方式解决这个问题?

有什么方法可以使用某种不同的数据类型(比如byte[])并且可能会在其上使用注释在最后一分钟转换为ByteBuffer

1 个答案:

答案 0 :(得分:1)

据我所知,没有办法。映射API使用字段类型而不是getter / setter,因此您不能将其存储为byte [],但让getter返回ByteBuffer。看起来你需要使用两个不同的DTO,一个用于Cassandra驱动程序,一个用于EJB。

看一下其他人已经请求自定义序列化的驱动程序的JIRA:https://datastax-oss.atlassian.net/browse/JAVA-566所以去投票:)