- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Spring-Data 和 Spring-Data MongoDB 来使用 @CompoundIndexes 注释来映射实体类,在该注释中我使用名称及其定义来指定索引。在我的生产环境中,我决定需要根据实际数据更改索引的一些属性。现在,每次我的应用程序启动时,它都会无法加载,因为无法创建与注释结果中的规范相匹配的索引,并且在初始化过程中会引发该异常(如下所示)。
是否有配置 spring data 和 mongodb 以便记录这些异常但不会导致容器启动失败?
Exception while creating index
! com.mongodb.MongoCommandException: Command failed with error 86: 'Trying to create an index with same name event_source_link_type_at_id_IDX with different key spec **** vs existing spec *****' on server 127.0.0.1:27017. The full response is { "ok" : 0.0, "errmsg" : "Trying to create an index with same name event_source_link_type_at_id_IDX with different key spec **** vs existing spec *****", "code" : 86 }
! at com.mongodb.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:115) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:114) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:159) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:173) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:215) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:198) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:170) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.operation.CreateIndexesOperation$1.call(CreateIndexesOperation.java:116) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.operation.CreateIndexesOperation$1.call(CreateIndexesOperation.java:111) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:230) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:221) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.operation.CreateIndexesOperation.execute(CreateIndexesOperation.java:111) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.operation.CreateIndexesOperation.execute(CreateIndexesOperation.java:66) ~[mongodb-driver-core-3.2.2.jar:na]
! at com.mongodb.Mongo.execute(Mongo.java:781) ~[mongodb-driver-3.2.2.jar:na]
! at com.mongodb.Mongo$2.execute(Mongo.java:764) ~[mongodb-driver-3.2.2.jar:na]
! at com.mongodb.DBCollection.createIndex(DBCollection.java:1541) ~[mongodb-driver-3.2.2.jar:na]
! at org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator.createIndex(MongoPersistentEntityIndexCreator.java:142) [spring-data-mongodb-1.8.4.RELEASE.jar:na]
最佳答案
事实证明这并不像我想象的那么容易,但可以通过一些额外的类(class)来完成。
首先,您需要重写创建索引的类并重写创建索引的方法,捕获匹配的异常并仅记录它们。
不幸的是,它是受包保护的,因此您需要在与我们扩展的类相同的包中创建一个类。
package org.springframework.data.mongodb.core.index;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
public class ExceptionIgnoringIndexCreator extends MongoPersistentEntityIndexCreator {
//assuming SLF4J as your logger otherwise, put your logger here
private static final Logger LOG = LoggerFactory.getLogger(ExceptionIgnoringIndexCreator.class);
public ExceptionIgnoringIndexCreator(MongoMappingContext mappingContext, MongoDbFactory mongoDbFactory) {
super(mappingContext, mongoDbFactory);
}
@Override
void createIndex(MongoPersistentEntityIndexResolver.IndexDefinitionHolder indexDefinition) {
try {
super.createIndex(indexDefinition);
} catch (final RuntimeException exp) {
final RuntimeException trans = translate(exp);
if (trans != null) {
throw trans;
} else {
LOG.warn("Exception while creating index", exp);
}
}
}
protected RuntimeException translate(final RuntimeException exp) {
if (exp == null || exp.getMessage().contains("Cannot create index")) {
return null;
}
return exp;
}
}
索引创建是由 MongoMappingContext 使用 ApplicationEventPublisherInterface 发布的事件触发的。我们需要一个类,我们可以延迟地将另一个 ApplicationEventPublisher 设置为委托(delegate),接口(interface)的两个方法将其调用委托(delegate)给该委托(delegate)。
public class DelegatingPublisher implements ApplicationEventPublisher {
private ApplicationEventPublisher delegate;
@Override
public void publishEvent(ApplicationEvent event) {
delegate.publishEvent(event);
}
@Override
public void publishEvent(Object event) {
delegate.publishEvent(event);
}
public void setDelegate(ApplicationEventPublisher delegate) {
this.delegate = delegate;
}
}
通常,您使用扩展 AbstractMongoConfig 并覆盖“mongo()”方法的类来配置 spring data mongoDB。
负责发布初始化索引的消息的组件是从“mongoMappingContext()”返回的组件,因此您需要重写该方法并扩展默认的 MongoMappingContext ,重写设置事件发布者的方法并传递我们的新方法委托(delegate)发布商代替它。
@Configuration
@EnableMongoRepositories("com.my.company")
public class MyMongoConfig extends AbstractMongoConfiguration {
...
@Override
@Bean
public MongoMappingContext mongoMappingContext() throws ClassNotFoundException {
final DelegatingPublisher dep = new DelegatingPublisher();
final MongoMappingContext mappingContext = new MongoMappingContext() {
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
super.setApplicationEventPublisher(dep);
}
};
mappingContext.setInitialEntitySet(getInitialEntitySet());
mappingContext.setSimpleTypeHolder(customConversions().getSimpleTypeHolder());
mappingContext.setFieldNamingStrategy(fieldNamingStrategy());
try {
final MongoPersistentEntityIndexCreator indexCreator = new ExceptionIgnoringIndexCreator(mappingContext, mongoDbFactory());
dep.setDelegate(new MongoMappingEventPublisher(indexCreator));
return mappingContext;
} catch (Exception exp) {
throw new RuntimeException(exp);
}
}
...
}
如果您使用基于 XML 的配置,则还需要一个类和指定的配置
public class EventDelegatingMongoMappingContext extends MongoMappingContext {
private ApplicationEventPublisher publisher;
public EventDelegatingMongoMappingContext(ApplicationEventPublisher publisher) {
this.publisher = publisher;
}
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
super.setApplicationEventPublisher(publisher);
}
}
<mongo:db-factory id="mongoDbFactory"
host="localhost"
port="27017"
dbname="database"
username="mycompany"
password="secret"/>
<bean id="delegatingPublisher" class="com.my.company.DelegatingPublisher">
<property name="delegate" ref="mappingEventPublisher" />
</bean>
<!-- Must be named 'mongoMappingContext' to be recognized up -->
<bean id="mongoMappingContext" class="com.my.company.EventDelegatingMongoMappingContext">
<constructor-arg>
<bean ref="delegatingPublisher" />
</constructor-arg>
</bean>
<bean id="mongoIndexCreator" class="org.springframework.data.mongodb.core.index.ExceptionIgnoringIndexCreator">
<constructor-arg>
<bean ref="mongoMappingContext"/>
</constructor-arg>
<constructor-arg>
<bean ref="mongoDbFactory"/>
</constructor-arg>
</bean>
<bean id="mappingEventPublisher" class="org.springframework.data.mongodb.core.index.MongoMappingEventPublisher">
<constructor-arg>
<bean ref="mongoIndexCreator"/>
</constructor-arg>
</bean>
关于java - 创建索引时出现异常 - Spring Data MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40568777/
我的应用程序从一个有 5 个选项卡的选项卡栏 Controller 开始。一开始,第一个出现了它的名字,但其他四个没有名字,直到我点击它们。然后根据用户使用的语言显示名称。如何在选项卡栏出现之前设置选
我有嵌套数组 json 对象(第 1 层、第 2 层和第 3 层)。我的问题是数据表没有出现。任何相关的 CDN 均已导入。该表仅显示部分。我引用了很多网站,但都没有解决我的问题。 之前我使用标准表来
我正在尝试设置要显示的 Parse PFLoginViewController。这是我的一个 View Controller 的类。 import UIKit import Parse import
我遇到了这个问题,我绘制的对象没有出现在 GUI 中。我知道它正在被处理,因为数据被推送到日志文件。但是,图形没有出现。 这是我的一些代码: public static void main(Strin
我有一个树状图,其中包含出现这样的词...... TreeMap occurrence = new TreeMap (); 字符串 = 单词 整数 = 出现次数。 我如何获得最大出现次数 - 整数,
因此,我提示用户输入变量。如果变量小于 0 且大于 10。如果用户输入 10,我想要求用户再次输入数字。我问时间的时候输入4,它说你输入错误。但在第二次尝试时效果很好。例如:如果我输入 25,它会打印
我已经用 css overflow 属性做了一个例子。在这个例子中我遇到了一个溢出滚动的问题。滚动条出现了,但没有工作意味着每当将光标移动到滚动条时,在这个滚动条不活动的时间。我对此一无所知,所以请帮
我现在正在做一个元素。当您单击一个元素时,会出现以下信息,我想知道如何在您单击下一个元素而不重新单击同一元素时使其消失....例如,我的元素中有披萨,我想单击肉披萨看到浇头然后点击奶酪披萨看到浇头和肉
我有一个路由器模块,它将主题与正则表达式进行比较,并将出现的事件与一致的键掩码链接起来。 (它是一个简单的 url 路由过滤,如 symfony http://symfony.com/doc/curr
这个问题在这里已经有了答案: 9年前关闭。 Possible Duplicate: mysql_fetch_array() expects parameter 1 to be resource, bo
我在底部有一个带有工具栏的 View ,我正在使用 NavigationLink 导航到该 View 。但是当 View 出现时,工具栏显示得有点太低了。大约半秒钟后,它突然跳到位。它只会在应用程序启
我试图在我的应用程序上为背景音乐添加一个 AVAudioPlayer,我正在主屏幕上启动播放器,尝试在应用程序打开时开始播放但出现意外行为... 它播放并立即不断创建新玩家并播放这些玩家,因此同时播放
这是获取一个数字,获取其阶乘并将其加倍,但是由于基本情况,如果您输入 0,它会给出 2 作为答案,因此为了绕过它,我使用了 if 语句,但收到错误输入“if”时解析错误。如果你们能提供帮助,我真的很感
暂停期间抛出异常 android.os.DeadObjectException 在 android.os.BinderProxy.transactNative( native 方法) 在 androi
我已经为猜词游戏编写了一些代码。它从用户输入中读取字符并在单词中搜索该字符;根据字符是否在单词中,程序返回并控制一些变量。 代码如下: import java.util.Random; import
我是自动化领域的新手。这是我的简单 TestNG 登录代码,当我以 TestNG 身份运行该代码时,它会出现 java.lang.NullPointerException,双击它会突出显示我导航到 U
我是c#程序员,我习惯了c#的封装语法和其他东西。但是现在,由于某些原因,我应该用java写一些东西,我现在正在练习java一天!我要创建一个为我自己创建一个虚拟项目,以便让自己更熟悉 Java 的
我正在使用 Intellij,我的源类是 main.com.coding,我的资源文件是 main.com.testing。我将 spring.xml 文件放入资源文件中。 我的测试类位于 test.
我想要我的tests folder separate到我的应用程序代码。我的项目结构是这样的 myproject/ myproject/ myproject.py moduleon
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 6 年前。 因此,我尝试比较 2 个值,一个
我是一名优秀的程序员,十分优秀!