Spring загружает несколько баз данных, не создавая таблицы - PullRequest
0 голосов
/ 27 января 2019

Это определение для баз данных в файле 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;
    }
}

1 Ответ

0 голосов
/ 27 января 2019

Хотя вы не показывали нам все связанные коды, я думаю, проблема в структуре вашего проекта и в том, как вы создавали сущности и репозитории.

Для работы с двумя отдельными базами данных с пружиной, я предпочитаю иметь два отдельных пакета для сущностей обеих ваших баз данных, вам также нужно иметь отдельные Repositories для обеих ваших баз данных

src/main/java
- com.multipledb   //Your db config classes are located here
  - firstdb
    - model  //entities of first database are located here
    - dao    //repositories of first database are located here
  - seconddb
    - model  //entities of second database are located here
    - dao    //repositories of second database are located here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...