Как перехватить событие при нажате на кнопку Ok в форме - Сменить пароль пользователя

Добрый день,
Скажите пожалуйста как перехватить событие смены пароля в форме (Сменить пароль пользователя) и вызвать сервис из бизнес логики?

image

Спасибо.

Добрый день.

Чтобы перехватить нажатие кнопки Ok, т.е. коммит формы, необходимо переопределить экран sec$User.changePassword. Чтобы это сделать, создайте новый экран и на вкладке Legacy Screen Templates выберите Extend an existing screen:
Screenshot 2020-10-22 at 12.29.51

В поле Extend screen выберите change-password-dialog.xml: sec$User.changePassword:
Screenshot 2020-10-22 at 12.32.10

В контроллере созданного экрана переопределите метод changePassword и сделайте свою реализацию:

import com.haulmont.cuba.gui.app.security.user.changepassw.ChangePasswordDialog;
import com.haulmont.cuba.security.entity.User;

import java.util.UUID;

public class ExtChangePasswordDialog extends ChangePasswordDialog {

    @Override
    public void changePassword() {
        if (validateAll()) {
            
            User targetUser;
            UUID targetUserId;
            if (user == null) {
                targetUserId = userSession.getUser().getId();
                targetUser = userSession.getUser();
            } else {
                targetUserId = user.getId();
                targetUser = user;
            }

            String newPassword = passwField.getValue();

            String passwordHash = passwordEncryption.getPasswordHash(targetUserId, newPassword);
            userManagementService.changeUserPassword(targetUserId, passwordHash);

            publishPasswordChangedEvent(targetUser, newPassword);

            showNotification(getMessage("passwordChanged"), NotificationType.HUMANIZED);

            close(COMMIT_ACTION_ID);
        }
    }
}

В зависимости от того, что сервис из бизнес логики должен сделать, возможно будет достаточно подписаться на UserPasswordChangedEvent без переопределения экрана и отрегировать на изменение пароля в слушателе, например:

import com.haulmont.cuba.gui.app.security.events.UserPasswordChangedEvent;
import org.slf4j.Logger;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

import javax.inject.Inject;

@Component
public class UserPasswordChangedListener implements ApplicationListener<UserPasswordChangedEvent> {

    @Inject
    private Logger log;

    @Override
    public void onApplicationEvent(UserPasswordChangedEvent event) {
        log.debug("UserPasswordChanged event is published");
    }
}

Глеб

Спасибо большое за подробное описание, Вы мне очень помогли.
Все работает!