本文介绍了Spring Data MongoDB< mongo:auditing/>原因IllegalArgumentException:不支持的实体无法确定IsNewStrategy的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将我的spring-data-mongodb(使用Maven)版本升级到1.9.5.RELEASE. (使用MongoClient而不是Mongo).我的Session文档类包含@LastModifiedDate批注.

I upgrade my spring-data-mongodb (using maven) version to 1.9.5.RELEASE. (using MongoClient instead of Mongo).My Session document class contains @LastModifiedDate annotation.

升级后,我得到了java.lang.IllegalArgumentException:不支持的实体com ...会话!无法确定IsNewStrategy.

After the upgrade, i got java.lang.IllegalArgumentException: Unsupported entity com...Session! Could not determine IsNewStrategy.

如果我从配置中删除,我不会收到错误,但它不会保存ModifyDate.我发现的所有解决方案都使用注释而不是xml文件与MongoDB配置相关.我该如何解决?

If i remove from the configuration i don't get the error but it doesn't save the modifiedDate.All the solutions I found related to MongoDB configuration using annotations and not xml file.How can i solve this?

Maven依赖项:

<dependency>
	<groupId>org.springframework.data</groupId>
	<artifactId>spring-data-mongodb</artifactId>
	<version>1.9.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.9.5</version>
</dependency>

Spring MongoDB配置包含:

Spring MongoDB configuration contain :

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:util="http://www.springframework.org/schema/util"
	xmlns:mongo="http://www.springframework.org/schema/data/mongo"
	xsi:schemaLocation="http://www.springframework.org/schema/context classpath:org/springframework/context/factory/xml/spring-context-3.0.xsd
						http://www.springframework.org/schema/data/mongo classpath:org/springframework/data/mongo/factory/xml/spring-mongo-1.8.xsd
						http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.1.xsd
						http://www.springframework.org/schema/util classpath:org/springframework/util/factory/xml/spring-util-3.0.xsd">

	<bean class="com.....core.CascadingMongoEventListener"/>
	<bean class="com.....core.DataEventListener"/>
			
	<mongo:auditing/>
	
	<mongo:mongo-client id="mongo" host="${host}" port="${port}">
		<mongo:client-options connections-per-host="100"
	                   		  connect-timeout="30000"
	                   		  max-wait-time="15000" 	                   	                   		  
	                   		  socket-keep-alive="true"
	                   		  socket-timeout="60000" />		
	</mongo:mongo-client>
		
	<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
		<constructor-arg name="mongo" ref="mongo" />
		<constructor-arg name="databaseName" value="${dbName}"/>		
		<property name="writeConcern">
            <util:constant static-field="com.mongodb.WriteConcern.SAFE" ></util:constant>
        </property>        
	</bean>
		
	<mongo:repositories base-package="com.....daos" mongo-template-ref="mongoTemplate"> 		
	</mongo:repositories>
	
	<context:component-scan base-package="com.....services"></context:component-scan>
	
	<!-- translate any MongoExceptions thrown in @Repository annotated classes -->
	<context:annotation-config />	
</beans>

我的文档:

package com.....session;

import java.util.Date;
import java.util.UUID;
import org.joda.time.DateTime;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate;

@Document(collection = "session")
public class Session {

	@Id
	protected UUID id;
	private DateTime creationDate;
	@LastModifiedDate
	private DateTime modifiedDate;

	public Session() {}
	
	//setters & getters	
}

推荐答案

诀窍是在审核和MongoTemplate之间共享MongoMappingContext.

The trick is to share a MongoMappingContext between auditing and the MongoTemplate.

首先替换:

<mongo:auditing/>

具有:

<bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
<mongo:auditing mapping-context-ref="mappingContext"/>

然后将MongoDbFactoryMongoConverter添加到您的xml设置中,如下所示:

Then add a MongoDbFactory and a MongoConverter to your xml settings as follows:

<mongo:db-factory id="mongoDbFactory" mongo-ref="mongo" dbname="${dbName}"/>
<mongo:mapping-converter id="mongoConverter" db-factory-ref="mongoDbFactory" mapping-context-ref="mappingContext"/> 

最后要做的是将MongoConverter注入模板.它为MongoTemplate提供映射上下文.为此,您将不得不使用备用构造函数.

Last thing to do, is to inject the MongoConverter into the template. It supplies the MongoTemplate with the mapping context. You will have to use an alternate constructor for that.

替换:

<constructor-arg name="mongo" ref="mongo" />
<constructor-arg name="databaseName" value="${dbName}"/>    

具有:

<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
<constructor-arg name="mongoConverter" ref="mongoConverter"/>

这篇关于Spring Data MongoDB&lt; mongo:auditing/&gt;原因IllegalArgumentException:不支持的实体无法确定IsNewStrategy的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-27 16:33