Это определение для баз данных в файле application.properties: Первая база данных:
spring.datasource.jdbc-url=jdbc:mysql://localhost:3306/police_db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=Admin
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
Вторая конфигурация базы данных:
enroll.datasource.jdbc-url=jdbc:mysql://localhost:3306/enrollment_db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
enroll.datasource.username=root
enroll.datasource.password=Admin
enroll.datasource.driverClassName=com.mysql.cj.jdbc.Driver
Я создал два класса конфигурации для двухбазы данных, это класс конфигурации для первой или основной базы данных:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactory",
basePackages = {"com.cpm.repository"})
public class PoliceDbConfig {
@Primary
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("dataSource") DataSource dataSource) {
return builder.dataSource(dataSource).packages("com.cpm.model").persistenceUnit("model")
.build();
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
Это класс конфигурации для второй базы данных:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "barEntityManagerFactory",
transactionManagerRef = "barTransactionManager", basePackages = {"com.enrollment.repository"})
public class EnrollmentDbConfig {
@Bean(name = "enrollmentDatasource")
@ConfigurationProperties(prefix = "enroll.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "barEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean barEntityManagerFactory(
EntityManagerFactoryBuilder builder, @Qualifier("enrollmentDatasource") DataSource dataSource) {
return builder.dataSource(dataSource).
packages("com.enrollment.model").
persistenceUnit("model")
.build();
}
@Bean(name = "barTransactionManager")
public PlatformTransactionManager barTransactionManager(
@Qualifier("barEntityManagerFactory") EntityManagerFactory barEntityManagerFactory) {
return new JpaTransactionManager(barEntityManagerFactory);
}
}
Основная проблема, с которой я сталкиваюсь, этотаблицы для сущностей не генерируются автоматически, я выполнил поиск проблемы в Интернете, и мне сказали добавить следующие аннотации:
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
Первая аннотация создает таблицы, но если я удаляю их и оставляю толькоВторая аннотация, которая мне нужна, таблицы не создаются.
Другая проблема заключается в том, что у меня есть sql-скрипт в папке ресурсов, который должен запускаться и заполнять таблицы при запуске приложения, но этоне делает этого.
Последняя проблема: у меня установлена базовая аутентификация с использованием Spring Security, но явсе еще остаются неавторизованными при тестировании любой из моих конечных точек, поэтому я предполагаю, что это потому, что таблица пользователей не заполняется при запуске приложения, поэтому я затем добавил пользователей через MYSQL верстак вручную и попробовал конечную точку, но это все равно приводит к неавторизованной ошибке,
Любая помощь по этим вопросам будет принята с благодарностью.ОБНОВЛЕНИЕ: Это класс конфигурации безопасности:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final SystemUserDetailService userDetailsService;
@Autowired
public SecurityConfig(SystemUserDetailService userDetailsService) {
this.userDetailsService = userDetailsService;
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(new BCryptPasswordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
//.antMatchers("/verification/**","/admin/**", "/login/**","/logout/**").authenticated()
.antMatchers("/verification/**","/admin/**", "/login/**","/logout/**").authenticated()
.and()
.httpBasic()
.realmName("Bio Connect")
.and()
.csrf()
.disable();
}
}
Кроме того, это мой класс UserDetailService:
@Component
public class SystemUserDetailService implements UserDetailsService {
private final SystemUserRepository repository;
@Autowired
public SystemUserDetailService(SystemUserRepository repository) {
this.repository = repository;
}
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
SystemUser user = repository.findByUsername(s);
if(user == null) {
throw new UsernameNotFoundException(String.format("User with the username %s doesn't exist", s));
}
// Create a granted authority based on user's role.
// Can't pass null authorities to user. Hence initialize with an empty arraylist
List<GrantedAuthority> authorities = new ArrayList<>();
if(user.isAdmin()) {
authorities = AuthorityUtils.createAuthorityList("ROLE_ADMIN");
}
// Create a UserDetails object from the data
UserDetails userDetails = new User(user.getUsername(), user.getPassword(), authorities);
return userDetails;
}
}