Java 为什么Spring数据无法检测MongoDB审计的IsNewsStrategy?
我正在尝试启用Spring数据MongoDB审计。但每当我试图启动我的服务器时,我都会遇到以下错误。你能告诉我这里出了什么问题吗?我使用的是Spring 4.1.6和Spring数据MongoDB 1.7.0Java 为什么Spring数据无法检测MongoDB审计的IsNewsStrategy?,java,spring,mongodb,spring-data-mongodb,spring-mongo,Java,Spring,Mongodb,Spring Data Mongodb,Spring Mongo,我正在尝试启用Spring数据MongoDB审计。但每当我试图启动我的服务器时,我都会遇到以下错误。你能告诉我这里出了什么问题吗?我使用的是Spring 4.1.6和Spring数据MongoDB 1.7.0 SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener java.la
SEVERE: Exception sending context initialized event to listener instance of class
org.springframework.web.context.ContextLoaderListener
java.lang.IllegalArgumentException: Unsupported entity
com.idearealty.product.shopchat.persistence.model.IdeaRealtyUser!
Could not determine IsNewStrategy. at
org.springframework.data.support.IsNewStrategyFactorySupport.getIsNewStrategy(IsNewStrategyFactorySupport.java:48)
at
org.springframework.data.auditing.IsNewAwareAuditingHandler.markAudited(IsNewAwareAuditingHandler.java:80)
at
org.springframework.data.mongodb.core.mapping.event.AuditingEventListener.onApplicationEvent(AuditingEventListener.java:54)
at
org.springframework.data.mongodb.core.mapping.event.AuditingEventListener.onApplicationEvent(AuditingEventListener.java:31)
at
org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:151)
at
org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:128)
at
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:331)
at
org.springframework.data.mongodb.core.MongoTemplate.maybeEmitEvent(MongoTemplate.java:1609)
at
org.springframework.data.mongodb.core.MongoTemplate.doInsert(MongoTemplate.java:792)
at
org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:742)
at
org.springframework.data.mongodb.repository.support.SimpleMongoRepository.save(SimpleMongoRepository.java:76)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606) at
org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:434)
at
org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:419)
at
org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:391)
at
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy62.save(Unknown Source) at
com.idearealty.product.shopchat.config.SetupDataLoader.onApplicationEvent(SetupDataLoader.java:52)
at
com.idearealty.product.shopchat.config.SetupDataLoader.onApplicationEvent(SetupDataLoader.java:1)
at
org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:151)
以下是实体代码
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import javax.persistence.Id;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.annotation.Transient;
import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
/**
* @author Debopam
*
*/
@Document(collection="IdeaRealtyUser")
@TypeAlias("user")
public class IdeaRealtyUser extends User implements UserDetails,Serializable {
@Id
private String id;
private String email;
private String phoneNumber;
private String role;
private String firstName;
private String lastName;
private Address address;
//private String password;
@Transient
private String matchingPassword;
@CreatedDate
protected Date createDate;
@LastModifiedDate
protected Date lastModifiedDate;
@CreatedBy
protected String createdBy;
@LastModifiedBy
protected String lastModifiedBy;
//getter and setter
}
和配置
<bean id="mongo" class="org.springframework.data.mongodb.core.MongoFactoryBean">
<property name="host" value="localhost" />
</bean>
<mongo:mongo host="127.0.0.1" port="27017">
<mongo:options connections-per-host="8"
threads-allowed-to-block-for-connection-multiplier="4"
connect-timeout="1000"
max-wait-time="1500"
auto-connect-retry="true"
socket-keep-alive="true"
socket-timeout="1500"
slave-ok="true"
write-number="1"
write-timeout="0"
write-fsync="true"/>
</mongo:mongo>
<mongo:db-factory dbname="shopchatdb" mongo-ref="mongo"/>
<!--
<mongo:auditing mapping-context-ref="customMappingContext" auditor-aware-ref="com.idearealty.product.util.MongoAuditAware"/>
-->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongo"/>
<constructor-arg name="databaseName" value="mongo"/>
</bean>
<mongo:auditing auditor-aware-ref="ideaRealtyAudit"/>
<context:component-scan base-package="com.idearealty.product.shopchat" />
若要解决此错误,请声明一个
并配置基本包
属性以指向包含域类的包。确保使用接受MongoDbFactory
和MongoConverter
的MongoTemplate
构造函数,并连接相应的bean定义
除此之外,您的配置看起来可疑地损坏了。您声明了两个bean,它们产生了一个Mongo
实例(一个通过工厂,一个通过名称空间)。此外,现在建议使用MongoClient
实例
简化到最低限度的最简单配置如下所示:
<!-- put options here -->
<mongo:mongo-client id="mongo" … />
<mongo:db-factory id="db-factory" mongo-ref="mongo" />
<!-- put your domain package here -->
<mongo:mapping-converter id="converter" base-package="…" />
<bean class="….MongoTemplate">
<constructor-arg ref="db-factory" />
<constructor-arg ref="converter" />
</bean>
<mongo:auditing …/>
问题在于Spring如何确定实体或模型的基本包。重写getMappingBasePackage()方法可以解决此问题。下面是Spring Mongodb配置文件
@Configuration
//@EnableTransactionManagement
@PropertySource({ "classpath:persistence.properties" })
@ComponentScan(basePackages={ "com.idearealty.product.persistence.model" })
@EnableMongoRepositories(basePackages = "com.idearealty.product.repository.mongodb")
@EnableMongoAuditing
public class PersistenceMongoConfig extends AbstractMongoConfiguration{
@Autowired
private Environment env;
public PersistenceMongoConfig() {
super();
}
@Bean(name="mongoAudit")
public AuditorAware<String> mongoAuditProvider() {
return new MongoAuditAware();
}
@Override
protected String getDatabaseName() {
return "shopdb";
}
@Override
public Mongo mongo() throws Exception {
return new MongoClient(new ServerAddress("localhost", 27017),mongoClientOptions());
}
@Bean
public MongoClientOptions mongoClientOptions() {
// override to more reasonable connection timeout (default is 10 seconds)
return MongoClientOptions.builder().connectTimeout(1500)
.connectionsPerHost(8)
.maxWaitTime(1500)
.socketKeepAlive(true)
.build();
}
@Override
protected String getMappingBasePackage() {
return "com.product.persistence.model";
}
}
@配置
//@启用事务管理
@PropertySource({“classpath:persistence.properties”})
@ComponentScan(basePackages={“com.idearealty.product.persistence.model”})
@enablemongorepositions(basePackages=“com.idearealty.product.repository.mongodb”)
@启用自动编辑
公共类PersistenceMongoConfig扩展了AbstractMongoConfiguration{
@自动连线
私人环境署;
公共持久性MongoConfig(){
超级();
}
@Bean(name=“mongoautit”)
公共AuditorAware mongoAuditProvider(){
返回新的MongoAuditAware();
}
@凌驾
受保护的字符串getDatabaseName(){
返回“shopdb”;
}
@凌驾
public Mongo Mongo()引发异常{
返回新的MongoClient(新的服务器地址(“localhost”,27017),MongoClient();
}
@豆子
公共MongoClientations MongoClientations(){
//覆盖到更合理的连接超时(默认值为10秒)
返回MongoClientOptions.builder().connectTimeout(1500)
.connectionsPerHost(8)
.maxWaitTime(1500)
.socketKeepAlive(真)
.build();
}
@凌驾
受保护的字符串getMappingBasePackage(){
返回“com.product.persistence.model”;
}
}
现在我遇到了以下错误类org.springframework.beans.factory.BeanCreationException:创建名为“converter.mongoMappingContext”的bean时出错:调用init方法失败;嵌套异常是com.mongodb.CommandFailureException:{“serverUsed”:“localhost:27017”,“createdCollectionAutomatically”:false,“numIndexesBefore”:2,“errmsg”:“异常:带模式的索引:{U fts:\'text\,\U ftsx:1}已存在,具有不同的选项”,“代码”:85,“确定”:0.0}我修正了这个问题,但仍然得到了最初的错误。移动到Spring数据1.6.2解决了该问题。我缺少什么?正确的设置。不幸的是,我无法了解您项目设置的所有细节,但我发布的内容基本上是您需要做的。您得到的错误与原始问题无关,是由索引问题引起的。正如我提到的,我修复了该索引问题,但仍然得到了isNewStrategy的原始错误。如果我在不扩展AbstractMongoConfig的情况下进行配置,我如何给出mappingbasepackage