【问题标题】:Spring Data MongoDB <mongo:auditing/> cause IllegalArgumentException: Unsupported entity Could not determine IsNewStrategySpring Data MongoDB <mongo:auditing/> 导致 IllegalArgumentException:不支持的实体无法确定 IsNewStrategy
【发布时间】:2017-04-05 21:45:43
【问题描述】:

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

升级后出现 java.lang.IllegalArgumentException: Unsupported entity com...Session!无法确定 IsNewStrategy。

如果我从配置中删除,我不会收到错误消息,但不会保存修改后的日期。 我发现的所有解决方案都与使用注释而不是 xml 文件的 MongoDB 配置相关。 我该如何解决这个问题?

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 配置包含:

<?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	
}

【问题讨论】:

    标签: java spring mongodb maven


    【解决方案1】:

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

    第一次替换:

    <mongo:auditing/>
    

    与:

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

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

    <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 提供映射上下文。您将不得不为此使用备用构造函数。

    替换:

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

    与:

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

    【讨论】:

    • 我们如何只用注解来实现这个配置?
    • 优秀的答案。天哪,我讨厌春天。 @gba 看这里:stackoverflow.com/a/44995905/177920
    • @Madbreaks 你链接到我的答案:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    • 2015-05-12
    • 1970-01-01
    • 2020-12-08
    相关资源
    最近更新 更多