ApplicationListener не выполняется при запуске приложения.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 ApplicationListener не выполняется при запуске приложения.

Сообщение Anonymous »

Я новичок в программировании, пытаюсь сделать простое приложение с реализацией пользователей, ролей и привилегий согласно мануалу. Я использую Sprint 3.3.3 и Java 17.
В руководстве предлагалось создать класс Loader, который будет заполнять базу данных при создании приложения. Так можно было бы, не прибегая к чистому SQL, создать первого админа, создать роли и привилегии для ролей.

Код: Выделить всё

SetupDataLoaderКласс 
реализует интерфейс ApplicationListener. Класс помечен аннотацией @Component. Я также попробовал метод onApplicationEvent пометить аннотацией @EventListener.
Но при запуске приложения код из класса не выполняется. Каждый раз после запуска проверяю содержимое db и вижу, что в таблицу User не добавлено ни одной новой строки. Я также пытался вывести сообщение из этого блока кода на консоль - оно не вышло.
МОЕ ПРИЛОЖЕНИЕ
ENTITIES

Код: Выделить всё

@Entity
@Table(name = "users")
@Data
public class UserEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

@Column(name = "login")
private String login;

@Column(name = "password")
private String password;

@ManyToMany
@JoinTable(
name = "users_roles",
joinColumns = @JoinColumn(
name = "user_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(
name = "role_id", referencedColumnName = "id"))
private Collection roles;

public UserEntity() {}
}

@Entity
@Table(name = "roles")
@Data
public class RoleEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;

@Column(name = "name")
private String name;

@ManyToMany
@JoinTable(
name = "roles_privileges",
joinColumns = @JoinColumn(
name = "role_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(
name = "privilege_id", referencedColumnName = "id"))
private Collection
 privileges;

public RoleEntity() {}

public RoleEntity(final String name) {
this.name = name;
}
}

@Entity
@Table(name = "priveleges")
@Data
public class PrivilegeEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@Column(name = "name")
private String name;

@ManyToMany(mappedBy = "privileges")
private Collection roles;

public PrivilegeEntity() {}

public PrivilegeEntity(final String name) {
this.name = name;
}
}
РЕПО

Код: Выделить всё

public interface UserRepo extends CrudRepository {

Optional findByLogin (String login);

}

public interface RoleRepo extends CrudRepository {

Optional findByName(String name);

}

public interface PrivilegeRepo extends CrudRepository
 {

Optional findByName(String name);

}
Настройки БЕЗОПАСНОСТИ:

Код: Выделить всё

@EnableWebSecurity
@Configuration
public class SequrityConfig {

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.securityContext((securityContext) -> securityContext.requireExplicitSave(true))
.authorizeHttpRequests(authorize -> authorize
.requestMatchers(HttpMethod.GET, "/roleHierarchy")
.hasRole("STAFF"));

return http.build();
}

@Bean
public SecurityExpressionHandler customWebSecurityExpressionHandler() {
DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy());
return expressionHandler;
}

@Bean
public RoleHierarchy roleHierarchy() {
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
String hierarchy = "ROLE_ADMIN > ROLE_MODER \n ROLE_MODER > ROLE_STAFF";
roleHierarchy.setHierarchy(hierarchy);
return roleHierarchy;
}

}
и наконец

Код: Выделить всё

@Component
public class SetupDataLoader implements ApplicationListener {

private boolean alreadySetup = false;

@Autowired
UserRepo userRepo;

@Autowired
RoleRepo roleRepo;

@Autowired
PrivilegeRepo privilegeRepo;

@Autowired
PasswordEncoder passwordEncoder;

// API

@Override
@Transactional
public void onApplicationEvent(final @NonNull ContextRefreshedEvent event) {
if (alreadySetup) {
return;
}

// == create init privileges
final PrivilegeEntity readPrivilege = createPrivilege("READ_PRIVILEGE");
final PrivilegeEntity userWritePrivilege = createPrivilege("USER_WRITE_PRIVILEGE");
final PrivilegeEntity switchStatePrivilege = createPrivilege("CHANGE_STATE_PRIVILEGE");
final PrivilegeEntity switchWritePrivilege = createPrivilege("SWITCH_WRITE_PRIVILEGE");
final PrivilegeEntity commentWritePrivilege = createPrivilege("COMMENT_WRITE_PRIVILEGE");

// == create init roles;
final List
 adminPrivileges = new ArrayList(Arrays
.asList(readPrivilege,
userWritePrivilege,
switchStatePrivilege,
switchWritePrivilege,
commentWritePrivilege));

final List moderPrivileges = new ArrayList(Arrays
.asList(readPrivilege,
switchWritePrivilege,
commentWritePrivilege));

final List staffPrivileges = new ArrayList(Arrays.asList(readPrivilege));

final RoleEntity adminRole = createRole("ROLE_ADMIN", adminPrivileges);
createRole("ROLE_MODER", moderPrivileges);
createRole("ROLE_STAFF", staffPrivileges);

// == create init users FIRST ADMIN in db
createUser("ADMIN", "ADMIN", new ArrayList(Arrays.asList(adminRole)));

alreadySetup = true;
}

@Transactional
public PrivilegeEntity createPrivilege(final String name) {
Optional optPrivilege = privilegeRepo.findByName(name);
PrivilegeEntity privilege;

if (optPrivilege.isPresent())
privilege = optPrivilege.get();
else {
privilege = new PrivilegeEntity(name);
privilege = privilegeRepo.save(privilege);
}

return privilege;
}

@Transactional
public RoleEntity createRole(final String name, final Collection privileges) {
Optional optRole = roleRepo.findByName(name);
RoleEntity role;

if (optRole.isPresent())
role = optRole.get();
else {
role = new RoleEntity(name);
}
role.setPrivileges(privileges);
role = roleRepo.save(role);
return role;
}

@Transactional
public UserEntity createUser(final String login, final String password, final Collection roles) {
Optional optUser = userRepo.findByLogin(login);
UserEntity user;

if (optUser.isPresent())
user = optUser.get();
else {
user = new UserEntity();
user.setLogin(login);
user.setPassword(passwordEncoder.encode(password));
}
user.setRoles(roles);
user = userRepo.save(user);
return user;
}
}
Пробую разные решения из Интернета, но после каждой попытки проверяю свою БД и все одно и то же:

Код: Выделить всё

prototype=# select * from users;
id | login | password
----+-------+----------
(0 rows)
Скажите, пожалуйста, почему не выполняется код из SetapDataLoader.java?

Подробнее здесь: https://stackoverflow.com/questions/790 ... p-is-launc
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»