有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Datanucleus类型转换插件

我为X类型创建了一个类似于here的转换器插件

然后我创建了这个类

class A {
    @Basic(fetch = FetchType.Eager)
    X x;
}

当我试图持久化一个对象时,我得到了以下错误

org.datanucleus.exceptions.NucleusDataStoreException: Object of type net.sf.jcommon.geo.Country isnt Serializable
org.datanucleus.store.rdbms.mapping.AbstractLargeBinaryRDBMSMapping.setObject(AbstractLargeBinaryRDBMSMapping.java:235)
org.datanucleus.store.mapped.mapping.SingleFieldMapping.setObject(SingleFieldMapping.java:207)
org.datanucleus.store.rdbms.fieldmanager.ParameterSetter.storeObjectField(ParameterSetter.java:201)
org.datanucleus.state.AbstractStateManager.providedObjectField(AbstractStateManager.java:1447)

从日志中可以看到,插件似乎已加载

Added converter for X<->java.lang.String using mypackage.myplugin.XStringConverter

使用调试器,我在转换器中设置了断点,但流没有到达那里

还有什么可能出了问题

我使用的是DataNucleus 3.1.3

插件代码如下

舱单。MF

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: myplugin
Bundle-SymbolicName: mypackage.myplugin
Bundle-Version: 1.0.1
Bundle-Vendor: Adrian Ber

插件。xml

<?xml version="1.0"?>
<plugin id="mypackage.myplugin" name="DataNucleus plug-ins" provider-name="myplugin">
<extension point="org.datanucleus.type_converter">
    <type-converter name="dn.x-string" member-type="mypackage.myplugin" 
        datastore-type="java.lang.String"
        converter-class="mypackage.myplugin.XStringConverter" />
</extension>
</plugin>

XStringConverter

package mypackage.myplugin;
import org.datanucleus.store.types.converters.TypeConverter;

public class XStringConverter implements TypeConverter<X, String> {

private static final long serialVersionUID = 1L;

@Override
public String toDatastoreType(Country memberValue) {
    return memberValue == null ? null : memberValue.getISO();
}

@Override
public Country toMemberType(String datastoreValue) {
    return  datastoreValue == null ? null : X.findByISO(datastoreValue.trim());
}
}

共 (2) 个答案

  1. # 1 楼答案

    正如我在对这个问题的评论中所说的,您也需要提供RDBMS JavaTypeMapping插件,因为没有它,就不会使用TypeConverter。只需编写一个简单的JavaTypeMapping来扩展ObjectAsStringMapping,并使用您的类型转换器

    在DN 3.2中,JavaTypeMapping不是必需的,类型转换器就足够了

  2. # 2 楼答案

    尝试将implements Serializable添加到类X中