Почему внедрение внутреннего класса в другой внутренний класс в том же внешнем классе не работает? - PullRequest
0 голосов
/ 11 июня 2019

У меня есть класс, в котором есть два внутренних класса. Я аннотировал внешний класс с помощью @Service, а оба внутренних класса - с помощью @Component. InnerClassA @Autowired в OuterClass и InnerClassB @Autowired в InnerClassA. Даже если все три компонента инициализируются, но innerClassB внутри InnerClassA имеет значение null.

@Service
public class ChatService{
    @Autowired
    private ChatServerUtils chatServerUtils;
    @Autowired
    private PushNotificationHelper pushNotificationHelper;

    @Component
    public class PushNotificationHelper{
        @Autowired
        private ChatServerUtils chatServerUtils; //this is null
        @Autowired
        private PushService pushService;

        @Async
        public void sendPushNotifications(Group group){
            Map<String, Integer> notificationData= new HashMap<>();
            Map<String, CompletableFurure<Integer>> unreadCountFutures = new ArrayList<>();
            for(Member member : group){
                CompletableFurure<Integer> unreadCountFuture = chatServerUtils.getUnreadCount(group, member);
                unreadCountFutures.put(member.getId(), unreadCountFuture);
            }
            for(Map.Entry<String, CompletableFurure<Integer>> entry : unreadCountFutures.entrySet()){
                notificationData.put(entry.getKey(), entry.getValue().get());
            }
            pushService.sendNotifications(notificationData);
        }
    }

    @Component
    public class ChatServerUtils{
        @Async
        public CompletableFuture<Integer> getUnreadCount(Group group, Member member){
            ...
        }
    }
}

Подробнее: Outer class - это чат-сервис, который обрабатывает вещи, связанные с пользователями чата, сообщениями и группами. Существует еще один сервис для отправки push-уведомлений. Когда сообщение отправляется в группу, я должен отправить push-уведомления всем пользователям в группе. Перед отправкой запроса на услугу push-уведомлений мне нужно связаться с внешним сервером чата и получить количество непрочитанных сообщений для каждого члена группы API сервера чата не поддерживает получение непрочитанных подсчетов всех пользователей за один вызов. Поскольку это трудоемкий процесс, мне нужно сделать это асинхронно. Вот почему я должен переместить эти методы в отдельные классы (чтобы использовать @Async). За исключением показанного метода в классе ChatServiceUtil, есть и другие методы, используемые как PushNotificationHelper, так и ChatService.

1 Ответ

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

Как насчет использования переменной chatServerUtils из вашего внешнего ChatService класса? Поскольку PushNotificationHelper инкапсулируется ChatService, он должен иметь доступ к закрытым переменным.

Кроме того, я до сих пор не вижу причин, по которым ваш код извлекает выгоду из этой конструкции внутреннего / внешнего класса. Вы говорите, что у вас есть несколько методов, которые оба внутренних класса используют из вашего внешнего класса, но эти внутренние классы могут все еще использовать эти методы, если вы добавите в них свой внешний класс. Мне кажется, что вы должны внимательно посмотреть на архитектуру вашего кода и, возможно, переосмыслить некоторые из него. Если вы не хотите этого делать, я надеюсь, что приведенный выше совет поможет.

...