2014-09-22 3 views
0

Я хочу, чтобы объект Object to MongoDB с Morphia.Morphia не может вставить класс в DB

Но я получил кучу исключений:

Exception in thread "main" java.lang.IllegalArgumentException: can't serialize class com.aerlingus.ta.models.b2b.faresearch.AirSearchPrefsType$CabinPref 
    at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:270) 

Вот это сохранить():

public void create(MODEL model) { 
    Object keyValue = get(model); 
    if(datastore.find(this.model).field(keyField.id()).equal(keyValue).get() == null){ 
     datastore.save(model); 
    } else { 
     throw new RuntimeException(String.format("Duplicate parameters '%s' : '%s'", keyField.id(), keyValue)); 
    } 
} 

Вот AirSearchPrefsType класс:

@Embedded 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "") 
public static class CabinPref { 

    @Embedded @Compare 
    @XmlAttribute(name = "PreferLevel") 
    protected PreferLevelType preferLevel; 

    @Embedded @Compare 
    @XmlAttribute(name = "Cabin") 
    protected CabinType cabin; 

    @Transient 
    @XmlAttribute(name = "CabinSubtype") 
    protected String cabinSubtype; 

и PreferLevelType:

@Embedded 
@XmlType(name = "PreferLevelType") 
@XmlEnum 
public enum PreferLevelType { 

    @Embedded 
    @XmlEnumValue("Only") 
    ONLY("Only"), 

    @XmlEnumValue("Unacceptable") 
    @Embedded 
    UNACCEPTABLE("Unacceptable"), 

    @XmlEnumValue("Preferred") 
    @Embedded 
    PREFERRED("Preferred"), 

    @Embedded 
    @XmlEnumValue("Required") 
    REQUIRED("Required"), 

    @Embedded 
    @XmlEnumValue("NoPreference") 
    NO_PREFERENCE("NoPreference"); 
    private final String value; 

и CabinType:

@Embedded 
@XmlType(name = "CabinType") 
@XmlEnum 
public enum CabinType { 

    @XmlEnumValue("First") 
    FIRST("First"), 

    @XmlEnumValue("Business") 
    BUSINESS("Business"), 

    @XmlEnumValue("Economy") 
    ECONOMY("Economy"); 
    private final String value; 

Я не мог понять, что здесь не так. Содержит ли Morphia статические внутренние классы или перечисления.

Как решить эту проблему?

ответ

1

Следующий код показывает исключения, как ваша:

package com.test.mongodb; 

import java.io.IOException; 
import java.io.Serializable; 

import org.junit.Test; 

import com.mongodb.BasicDBObject; 
import com.mongodb.DBCollection; 
import com.mongodb.MongoClient; 

public class TestMongo { 

    static class Temp implements Serializable { 

     private static final long serialVersionUID = 1L; 
     private String name; 

     public Temp(String name) { 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 
    } 

    @Test 
    public void test() { 
     try { 
      MongoClient mongoClient = new MongoClient(); 
      DBCollection collection = mongoClient.getDB("test").getCollection("temp"); 

      Temp temp = new Temp("Current time: " + System.currentTimeMillis()); 

      collection.insert(new BasicDBObject("JavaObject", temp)); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Вы можете попробовать этот способ:

package com.test.mongodb; 

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 

import org.junit.Test; 

import com.mongodb.BasicDBObject; 
import com.mongodb.DBCollection; 
import com.mongodb.DBCursor; 
import com.mongodb.DBObject; 
import com.mongodb.MongoClient; 

public class TestMongo { 

    static class Temp implements Serializable { 

     private static final long serialVersionUID = 1L; 
     private String name; 

     public Temp(String name) { 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     } 
    } 

    @Test 
    public void test(){ 
     try { 
      MongoClient mongoClient = new MongoClient(); 
      DBCollection collection = mongoClient.getDB("test").getCollection("temp"); 

      Temp temp = new Temp("Currect time: " + System.currentTimeMillis()); 

      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      ObjectOutputStream oos = new ObjectOutputStream(baos); 
      oos.writeObject(temp); 
      collection.insert(new BasicDBObject("JavaObject", baos.toByteArray())); 

      readObject(collection); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    /** 
    * read the java object from mongodb 
    * @param collection 
    */ 
    public void readObject(DBCollection collection){ 
     try { 
      DBCursor cursor = collection.find(); 
      for (DBObject dbObject : cursor) { 
       ByteArrayInputStream bais = new ByteArrayInputStream((byte[]) dbObject.get("JavaObject")); 
       ObjectInputStream ois = new ObjectInputStream(bais); 
       Temp temp = (Temp) ois.readObject(); 
       System.out.println(temp.getName()); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Такой подход не соответствует морфий точно, но к самому Монго.

+0

Я думаю, что причина появления исключений, возможно, исходит от самого монгоба. – CLovinr

+0

действительно хороший улов. –

+0

@nazar_art Ваше изменение должно быть упомянуто в комментарии к этому ответу вместо фактического редактирования. – admdrew

Смежные вопросы