我正在使用Java + Spring + MongoTemplate + MongoDB。如果我想将对象插入我的MongoDB,那么我有错误:
java.lang.IllegalArgumentException: can't serialize class java.lang.Class
这是我的mongo-context.xml:
<mongo:mongo id="mongoLocal" host="${local.mongo.host}" port="${local.mongo.port}">
<mongo:options
connections-per-host="700"
threads-allowed-to-block-for-connection-multiplier="100"
connect-timeout="15000"
auto-connect-retry="true"
socket-timeout="60000"
write-number="1"/>
</mongo:mongo>
<mongo:db-factory id="mongoDbFactoryLocal" dbname="${local.mongo.db}" mongo-ref="mongoLocal"/>
<bean id="mongoConverterLocal" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
<constructor-arg index="0" ref="mongoDbFactoryLocal" />
<constructor-arg index="1">
<bean class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
</constructor-arg>
<property name="mapKeyDotReplacement" value="\+"/>
</bean>
<bean id="mongoTemplateLocal" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactoryLocal"/>
<constructor-arg name="mongoConverter" ref="mongoConverterLocal"/>
</bean>
mongo-context.xml我导入到spring-context.xml并使用它:
<bean id="statusDao" class="com.status.StatusDAOImpl">
</bean>
<bean id="BasicDAO" class="com.status.PreparableDAO">
<property name="daos">
<list>
<ref bean="statusDao"/>
</list>
</property>
<property name="template" ref="mongoTemplateLocal"/>
</bean>
最后我试图插入Mongo的类(SimpleMessage):
public abstract class Message implements Serializable {
@Id
private String id;
public Message() {super();}
public Message(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
和
@Document
public class EmlMessage extends Message {
private WatchEvent.Kind<Path> eventType;
private String emlPath;
public EmlMessage() {
super();
}
public EmlMessage(String id,
WatchEvent.Kind<Path> eventType,
StatusType statusType,
String emlPath) {
super(id, statusType);
this.eventType = eventType;
this.emlPath = emlPath;
}
public EmlMessage(String id,
String eventType,
StatusType statusType,
String emlPath) {
super(id, statusType);
this.emlPath = emlPath;
chooseEventType(eventType);
}
public WatchEvent.Kind<Path> getEventType() {
return eventType;
}
public void setEventType(WatchEvent.Kind<Path> eventType) {
this.eventType = eventType;
}
public void setEventType(String eventType) {
chooseEventType(eventType);
}
private void chooseEventType(String eventType) {
if (eventType.equalsIgnoreCase("ENTRY_CREATE"))
this.eventType = StandardWatchEventKinds.ENTRY_CREATE;
else if (eventType.equalsIgnoreCase("ENTRY_MODIFY"))
this.eventType = StandardWatchEventKinds.ENTRY_MODIFY;
else if (eventType.equalsIgnoreCase("ENTRY_DELETE"))
this.eventType = StandardWatchEventKinds.ENTRY_DELETE;
else
this.eventType = null;
}
@Override
public int hashCode() {
int hash = 1;
hash = hash * 31 + (getId() == null ?
"".hashCode() : getId().hashCode());
hash = hash
+ (arriveDateTime == null ? 0 : arriveDateTime.hashCode());
return hash;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof EmlMessage))
return false;
SimpleMessage otherA = (SimpleMessage) obj;
return getId().equals(otherA.getId());
}
}
有什么想法吗?我知道我可以扩展BasicDBObject,但是如果我实现了MongoMappingConverter,为什么还需要这样做。
答案 0 :(得分:2)
问题出现在java.nio.file.StandardWatchEventKinds的变量WatchEvent.Kind中。这个类是公共最终类StandardWatchEventKinds。我刚刚切换到String。现在它看起来像
@Document
public class EmlMessage extends Message {
private String eventType;
private String emlPath;
public EmlMessage() {
super();
}
public EmlMessage(String id,
WatchEvent.Kind<Path> eventType,
StatusType statusType,
String emlPath) {
super(id, statusType);
this.eventType = eventType.name();
this.emlPath = emlPath;
}
public EmlMessage(String id,
String eventType,
StatusType statusType,
String emlPath) {
super(id, statusType);
this.emlPath = emlPath;
this.eventType = eventType;
}
public String getEventType() {
return eventType;
}
public void setEventType(WatchEvent.Kind<Path> eventType) {
this.eventType = eventType.name();
}
public void setEventType(String eventType) {
this.eventType = eventType;
}
public String getEmlPath() {
return emlPath;
}
public void setEmlPath(String emlPath) {
this.emlPath = emlPath;
}