2013-03-26 24 views
0

我創建了一個轉換器插件等中記載here的類型X.DataNucleus將type_converter插件

然後,我創建的類

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。

插件代碼如下。

MANIFEST.MF

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

的plugin.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()); 
} 
} 
+0

您的類X是否實現了Serializable? – 2013-03-26 07:19:37

+0

不,它沒有。但是,如果我有一個轉換爲String類的轉換器,我認爲它不應該。 – 2013-03-26 07:21:50

+0

如果你創建了一個插件,那麼爲什麼不發佈它...轉換器,plugin.xml,MANIFEST.MF等等。並且說明你是否爲它提供了關聯的XXXMapping類(對於RDBMS數據存儲區,3.1必需,3.2是可選的) – DataNucleus 2013-03-26 07:27:24

回答

1

,比如M說對這個問題發表評論,您還需要提供RDBMS JavaTypeMapping插件,因爲如果沒有這樣的話,TypeConverter就不會被使用。只需編寫一個擴展ObjectAsStringMapping的簡單JavaTypeMapping,並使用TypeConverter。

在DN 3.2中,JavaTypeMapping不是必需的,TypeConverter就足夠了。

0

嘗試添加implements Serializable到您的類X.

+0

然後該字段將被序列化爲二進制,而不是字符串。而最重要的是,不使用轉換器。 – 2013-03-26 07:24:10

+0

在DataNucleus給出的例子中,URI實現了Serializable。轉換髮生是因爲您在plugin.xml中指定了它。 – 2013-03-26 07:32:41