我一直在尝试但未能模仿Baeldung文章关于如何触发"子"保存的演练:一个通过Spring Boot的@DBRef注释"包含"在另一个实体中的实体。就我而言,我正在尝试从客户那里获取地址(子地址)。
我正在发布我的简短配置文件以及可疑代码,因为我不知道它的格式是否不正确。
我怀疑错误的代码位于 src> main> java> foo.bar 下一个名为"CustomerCascadeSaveMongoEventListener.java"的类中,如下所示:
@Override
public class CustomerCascadeSaveMongoEventListener extends AbstractMongoEventListener {
@Autowired
private MongoOperations mongoOperations;
@Override
public void onBeforeConvert(BeforeConvertEvent<Object> event) {
Object source = event.getSource();
if ((source instanceof Customer) && (((Customer) source).getAddress() != null)) {
mongoOperations.save(((Customer) source).getAddress());
}
}
}
IntelliJ 对@Override进行红色波浪线以表示不覆盖,并将方法签名设置为与错误消息相同的原因。
由于不知道还能怎么称呼它,我的XML文件被称为"cascade.properties",在src>主要>java> foo.bar>资源下,看起来像:
<mongo:mongo-client id="mongoClient" host="localhost" />
<mongo:db-factory id="mongoDbFactory" dbname="test" mongo-ref="mongoClient" />
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg ref="mongoDbFactory"/>
</bean>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean class="org.baeldung.event.CustomerCascadeSaveMongoEventListener" />
最后,在我的 Customer 类中,引用地址的字段如下所示:
@DBRef
@NotNull
private Address address;
主要错误消息如下:
错误:(16, 17) java: name clash: onBeforeConvert(org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent) inio.catalyte.training.CustomerCascadeSaveMongoEventListener 和 onBeforeConvert(org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent) in org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener 具有相同的擦除,但两者都不会覆盖另一个
我认为解决这个问题也将消除第二条错误消息:
错误:(15, 5) java:方法不覆盖或实现超类型中的方法
虽然我的配置文件可能与错误无关,但如果其内容中的任何内容不支持或对于我要的级联保存行为是不必要的,我将不胜感激。到目前为止,编写它的内容只是为了支持此功能。
尽管其他人不太可能遇到这个问题,但对于后代来说:
正如人们可能猜到的那样,Baeldung的代码没有任何问题,只是我复制它的方式。我的错误有两个,都与班级签名有关。它应该看起来像这样:
public class CustomerCascadeSaveMongoEventListener extends AbstractMongoEventListener<Object> {
没有我给它的注释。
同样对于后代来说,像MongoConfig这样的Java配置文件通常位于主包中称为"config"的子包中。为了使此功能正常工作,我的MongoTransactionConfig文件如下所示:
@Configuration
@EnableMongoRepositories(basePackages = "io.catalyte.training.repositories")
public class MongoTransactionConfig extends AbstractMongoConfiguration {
@Bean
public CustomerCascadeSaveMongoEventListener customerCascadingMongoEventListener() {
return new CustomerCascadeSaveMongoEventListener();
}
@Bean
MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
@Override
protected String getDatabaseName() {
return "test";
}
@Override
public MongoClient mongoClient() {
return new MongoClient("127.0.0.1", 27017);
}
}
尽管您或您的 IDE 需要提供相应的包和导入语句。