我尝试将Java pet-project从手写SQL切换到Ebean。当我现在运行项目时,我收到消息
Was unable to use reflection to find a constructor and appropriate getters forimmutable type interface j`avax.money.MonetaryAmount`
之后是更多与javamoney相关的错误。
我知道MonetaryAmont有一个私人构造函数,并通过公共静态方法实现。如何告诉Ebean如何序列化MonetaryAmount?
答案 0 :(得分:2)
我放弃了Ebean,而是使用了Eclipselink。具有讽刺意味的是,我找到了问题的答案。因此对于处于类似情况的人来说,我应该做的就是:
我正在寻找的东西叫做ScalarTypeConverter。它们在Ebean中没有很好的记录。但是javadoc上有一些GitHub和至少一个关于它们的问题。
Ebean
中不需要实现Serializable答案 1 :(得分:0)
请阅读this
以下是摘录
public interface Serializable
类的可序列化由实现该类的类启用 java.io.Serializable接口。没有实现此功能的类 接口不会将其任何状态序列化或反序列化。 可序列化类的所有子类型本身都是可序列化的。该 序列化接口没有方法或字段,仅用于 确定可序列化的语义。
要允许序列化非序列化类的子类型, 子类型可能承担保存和恢复状态的责任 超类型的公共,受保护和(如果可访问)包 领域。只有在类中,子类型才可以承担此责任 它扩展了一个可访问的无参数构造函数来初始化 阶级的状态。如果这样,声明一个Serializable类是错误的 事实并非如此。将在运行时检测到错误。
在反序列化期间,非序列化类的字段将是 使用公共或受保护的无参数构造函数初始化 类。必须可以访问子类的无参数构造函数 序列化。将恢复可序列化子类的字段 来自溪流。
遍历图形时,可能遇到没有的对象 支持Serializable接口。在这种情况下 将抛出NotSerializableException并将标识该类 不可序列化的对象。
在序列化期间需要特殊处理的类 反序列化过程必须实现这些特殊方法 确切的签名:
private void writeObject(java.io.ObjectOutputStream out) 抛出IOException private void readObject(java.io.ObjectInputStream in) 抛出IOException,ClassNotFoundException; private void readObjectNoData() 抛出ObjectStreamException;
writeObject方法负责写入的状态 对象为其特定的类使对应的readObject 方法可以恢复它。保存对象的默认机制 可以通过调用out.defaultWriteObject来调用字段。方法 不需要关心属于它的国家 超类或子类。通过写个人来拯救国家 使用writeObject方法或by的字段到ObjectOutputStream 使用DataOutput支持的原始数据类型的方法。
readObject方法负责从流中读取和 恢复类字段。它可以调用in.defaultReadObject 调用默认机制来恢复对象的非静态和 非瞬态场。 defaultReadObject方法使用的信息 用于分配流中保存的对象的字段的流 当前对象中相应命名的字段。这处理 当类已经发展为添加新字段时的情况。该方法 不需要关心属于它的国家 超类或子类。通过写个人来拯救国家 使用writeObject方法或by的字段到ObjectOutputStream 使用DataOutput支持的原始数据类型的方法。
readObjectNoData方法负责初始化状态 如果是特定类的对象的话 序列化流不会将给定的类列为超类 被反序列化的对象。这种情况可能发生在 接收方使用不同版本的反序列化 实例的类比发送方和接收方的版本 扩展未由发件人版本扩展的类。这个 如果序列化流已被篡改,也可能发生;因此, readObjectNoData对于初始化反序列化对象很有用 尽管有一个敌对的"或不完整的源流。
需要指定替代对象的可序列化类 在将对象写入流时应该使用它 具有确切签名的特殊方法:
ANY-ACCESS-MODIFIER对象writeReplace()抛出 ObjectStreamException;
如果方法是序列化,则调用此writeReplace方法 存在,它可以从中定义的方法访问 被序列化的对象的类。因此,该方法可以具有 私有,受保护和包私有访问。子类访问此 方法遵循java可访问性规则。
需要在其实例时指定替换的类 从流中读取应该实现这个特殊的方法 确切的签名。
ANY-ACCESS-MODIFIER对象readResolve()抛出 ObjectStreamException;
此readResolve方法遵循相同的调用规则和 可访问性规则为writeReplace。
序列化运行时与每个可序列化的类a关联 版本号,称为serialVersionUID,在此期间使用 反序列化以验证序列化的发送方和接收方 object已加载与该对象兼容的类 尊重序列化。如果接收器已加载了一个类 具有与其不同的serialVersionUID的对象 相应的发件人的类,然后反序列化将导致 InvalidClassException。可序列化的类可以声明它自己的类 serialVersionUID通过声明一个名为的字段显式地显示 "的serialVersionUID"必须是static,final和long类型:
ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;
如果可序列化类没有显式声明a serialVersionUID,然后序列化运行时将计算一个 基于各个方面的该类的默认serialVersionUID值 该类的类,如Java(TM)对象序列化中所述 规格。但是,强烈建议所有人 可序列化类显式声明serialVersionUID值,因为 默认的serialVersionUID计算对类非常敏感 细节可能因编译器实现而异,并且可以 因此导致意外的InvalidClassExceptions期间 反序列化。因此,要保证一致的serialVersionUID 不同java编译器实现的值,可序列化 class必须声明一个显式的serialVersionUID值。也是 强烈建议显式serialVersionUID声明使用 尽可能使用私有修饰符,因为此类声明仅适用于 立即声明的类 - serialVersionUID字段不是 作为继承成员有用。数组类不能声明显式 serialVersionUID,所以它们总是有默认的计算值,但是 免除匹配serialVersionUID值的要求 数组类。