Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 莫菲娅可以';t在数据库中插入类_Java_Mongodb_Enums_Inner Classes_Morphia - Fatal编程技术网

Java 莫菲娅可以';t在数据库中插入类

Java 莫菲娅可以';t在数据库中插入类,java,mongodb,enums,inner-classes,morphia,Java,Mongodb,Enums,Inner Classes,Morphia,我想用Morphia向MongoDB发起攻击 但我有很多例外: 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

我想用Morphia向MongoDB发起攻击

但我有很多例外:

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)
这里是save():

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));
    }
}
@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;
@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;
@Embedded
@XmlType(name = "CabinType")
@XmlEnum
public enum CabinType {

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

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

    @XmlEnumValue("Economy")
    ECONOMY("Economy");
    private final String value;
以下是AirSearchPrefsType类

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));
    }
}
@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;
@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;
@Embedded
@XmlType(name = "CabinType")
@XmlEnum
public enum CabinType {

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

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

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

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));
    }
}
@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;
@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;
@Embedded
@XmlType(name = "CabinType")
@XmlEnum
public enum CabinType {

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

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

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

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));
    }
}
@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;
@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;
@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使用静态内部类还是枚举


如何解决此问题?以下代码将显示与您类似的异常:

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();
        }
    }
}
您可以这样尝试:

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();
        }
    }
}

这种方法并不完全符合Morphia,但符合Mongo本身。

我认为出现异常的原因可能来自mongodb本身。@nazar\u art您的编辑可能应该在对此答案的评论中提及,而不是实际编辑。@Admdew在我看来,关闭流很重要。减少“错误”代码。纳扎尔·阿特:是的,你可能是对的,但自己改变答案并不是最好的办法。