无法覆盖onBeforeConvert:“ ...具有相同的擦除,但没有一个覆盖另一个”

时间:2019-06-19 21:19:41

标签: java mongodb spring-boot spring-data

我一直在尝试,但没有模仿Baeldung article的演练来说明如何触发“子”上的保存:一个通过Spring Boot的@DBRef注释“包含”在另一个中的实体。就我而言,我正在尝试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> main> 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:名称冲突:io.catalyte.training.CustomerCascadeSaveMongoEventListener中的onBeforeConvert(org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent)和onBeforeConvert(org.springframework.data。 org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener中的mongodb.core.mapping.event.BeforeConvertEvent)具有相同的擦除方式,但是两者均不能覆盖另一个

我认为解决该问题还将消除第二条错误消息:

  

错误:(15,5)java:方法没有重写或实现超类型的方法

虽然我的配置文件很可能与错误无关,但是如果指针中有关其内容的任何内容不支持或者对于我要执行的级联保存行为而言是不必要的,我将不胜感激。到目前为止,其内容仅出于支持此功能的目的而编写。

1 个答案:

答案 0 :(得分:0)

为了后代,其他任何人不太可能会遇到这个问题:

正如人们可能猜到的那样,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将需要提供适当的package和import语句。