Невозможно переопределить onBeforeConvert: «... имеет такое же стирание, но ни одно не переопределяет другое» - PullRequest
0 голосов
/ 20 июня 2019

Я пытался, но не смог имитировать статью Baeldung * Пошаговое руководство о том, как вызвать сохранение «потомка»: объекта, который «содержится» в другом с помощью Spring Boot @DBRef. аннотаций. В моем случае я пытаюсь восстановить адрес (дочерний) от клиента.

Я публикую свой краткий файл конфигурации, а также подозрительный код, потому что я не знаю, искажен ли он.

Код, который я подозреваю, является ошибочным, находится в классе под названием «CustomerCascadeSaveMongoEventListener.java» в src> main> java> foo.bar и выглядит так:

@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> и выглядит так:

<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.spr. mongodb.core.mapping.event.BeforeConvertEvent) в org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener имеют такое же стирание, но ни один не переопределяет другие

Я думаю, что решение этой проблемы также устранит второе сообщение об ошибке:

Ошибка: (15, 5) java: метод не переопределяет или не реализует метод из супертипа

Хотя мой файл конфигурации может не иметь ничего общего с ошибкой (ями), я был бы признателен за указатели, если что-либо в его содержимом не будет поддерживаться или будет ненужным для каскадного сохранения, которое я собираюсь использовать. Пока что его содержание было написано только с целью поддержки этой функции.

1 Ответ

0 голосов
/ 28 июня 2019

Хотя вряд ли кто-то другой будет иметь именно эту проблему, для потомков:

Как и следовало догадаться, в коде Баэльдуна не было ничего плохого, только то, как я его скопировал. Моих ошибок было две, обе из-за подписи класса. Это должно было выглядеть так:

public class CustomerCascadeSaveMongoEventListener extends AbstractMongoEventListener<Object> {

без аннотации, которую я дал.

Также для потомков файлы конфигурации Java, такие как MongoConfig, часто находятся в основном пакете в подпакете, называемом «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 потребуется предоставить соответствующий пакет и операторы импорта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...