【问题标题】:Cannot Override onBeforeConvert: "...have the same erasure, yet neither overrides the other"无法覆盖 onBeforeConvert:“......具有相同的擦除,但都不会覆盖另一个”
【发布时间】:2019-06-19 21:19:41
【问题描述】:

我一直在尝试但未能模仿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 red-squiggles @Override 不覆盖和方法签名,原因与错误消息相同。

由于不知道还能叫什么,我的 XML 文件名为“cascade.properties”,位于 src > main > java > foo.bar > resources 下,如下所示:

<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: 名称冲突: onBeforeConvert(org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent) 在 io.catalyte.training.CustomerCascadeSaveMongoEventListener 和 onBeforeConvert(org.springframework.data. org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener 中的 mongodb.core.mapping.event.BeforeConvertEvent) 具有相同的擦除,但都不会覆盖另一个

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

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

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

【问题讨论】:

    标签: java mongodb spring-boot spring-data


    【解决方案1】:

    虽然其他人不太可能遇到这个问题,但为了后代:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2023-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多