Java 莫菲娅可以';t在数据库中插入类
我想用Morphia向MongoDB发起攻击 但我有很多例外: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
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在我看来,关闭流很重要。减少“错误”代码。纳扎尔·阿特:是的,你可能是对的,但自己改变答案并不是最好的办法。