Как я могу реализовать BeanPostProcessor с обнуляемым "beanName" в Kotlin? - PullRequest
0 голосов
/ 04 февраля 2019

Проблема в том, что мне нужно сделать beanName обнуляемым.Из-за некоторых частей пружины вместо действительного имени бина null (например, Quartz).Та же самая реализация на Java работает правильно.

Я пытался добавить аннотацию JetBrain @Nullable.Не работаетИ декомпилированный класс кажется странным .Более того, я сделал полный клон BeanPostProcessor в папке проекта с другим именем, сделал реализацию на kotlin и сделал beanName обнуляемой без каких-либо ошибок.

//Java
package org.myapp;

import org.springframework.beans.BeansException;
import org.springframework.lang.Nullable;

// My clone of BeanPostProcessor
public interface CloneOfBeanPostProcessor {

    @Nullable
        default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }

    @Nullable
    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

// Kotlin
package org.myapp

import org.myapp.CloneOfBeanPostProcessor
import org.springframework.stereotype.Component


@Component
class MessageSourceBeanPostProcessorOld : CloneOfBeanPostProcessor {
    // Have no warnings in this case.
    override fun postProcessAfterInitialization(bean: Any, beanName: String?): Any? {...}

Пример проблемы Котлина ниже.Здесь я получаю 'postProcessAfterInitialization' overrides nothing, если добавить ? к типу beanName:

@Component
class MessageSourceBeanPostProcessorOld : BeanPostProcessor {
    override fun postProcessAfterInitialization(bean: Any, beanName: String?): Any? {...}

Тот же код на Java работает хорошо:

@Component
class MessageSourceBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {...}

Теперь мы используем версию 2.0 с весенней загрузкой+0,6.В версии 2.1.x проблема не воспроизводится.Однако я хочу разобраться с этой проблемой.Это пробел в моих знаниях или это ошибка, и я должен сообщить об этом?

UPD: Как сказал Юджин, проблема заключалась в объявлении ненулевого API на уровне пакета, представленном весной 5.Икс.Проблема решена путем обновления версии с весенней загрузкой до 2.1.x (по крайней мере, для проблемы с автоконфигурацией кварца).

1 Ответ

0 голосов
/ 04 февраля 2019

Spring использует аннотацию всего пакета, чтобы объявить, что все параметры (если не указано явно) не обнуляются.

Вы можете добавить крошечный абстрактный Java-класс в середине и четко пометить все параметры * 1003.* аннотация.Наследование от этого типа должно работать для вашего случая

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