решено: я долго отлаживал, чтобы решить проблему с Spring, Hikari и H2.Этот пост должен поделиться моим решением.Больше не требуется помощь.
У меня было приложение Spring Boot со стандартной формой входа в систему.Данные об имени пользователя и пароле находились в базе данных H2, доступ к которой осуществлялся через Hikari.Я мог просматривать и редактировать свои данные в консоли H2, но вход в систему не работал, даже когда я предоставил правильные учетные данные.
Я запускал свое приложение в качестве автономного jar.Когда я перезапустил свое приложение, у меня все еще были старые данные в моей базе данных H2, хотя Spring должен удалить эти данные.
Вот основной класс:
package com.github.mhdirkse.timewriter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
public class TimeWriterApplication {
public static void main(String[] args) {
SpringApplication.run(TimeWriterApplication.class, args);
}
@Bean
UserDetailsServiceImpl userDetailsService() {
return new UserDetailsServiceImpl();
}
}
Вот мойApplications.properties:
spring.jpa.database=default
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
# Datasource
spring.datasource.jdbcUrl=jdbc:h2:file:~/test2
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver
logging.level.com.github.mhdirkse.=DEBUG
А вот мой UserDetailsServiceImpl ():
package com.github.mhdirkse.timewriter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import com.github.mhdirkse.timewriter.model.UserInfo;
public class UserDetailsServiceImpl implements UserDetailsService {
private Logger logger = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
@Autowired
private UserInfoRepository userInfoRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
logger.debug(String.format("Login requested with username %s", username));
UserInfo user = userInfoRepository.findByUsername(username);
if(user == null) {
logger.debug("User not found in database");
throw new UsernameNotFoundException(username);
}
logger.debug("Obtained user %s from database.", user.getUsername());
return new UserPrincipal(user);
}
}
Был получен следующий вывод консоли:
2018-10-17 18:41:52.026 DEBUG 10152 --- [nio-8080-exec-8] c.g.m.timewriter.UserDetailsServiceImpl : Login requested with username mhdirkse
2018-10-17 18:41:52.186 INFO 10152 --- [nio-8080-exec-8] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactory
2018-10-17 18:41:53.261 DEBUG 10152 --- [nio-8080-exec-8] c.g.m.timewriter.UserDetailsServiceImpl : User not found in database
2018-10-17 18:43:35.546 DEBUG 10152 --- [nio-8080-exec-7] c.g.m.timewriter.UserDetailsServiceImpl : Login requested with username mhdirkse
2018-10-17 18:43:35.555 DEBUG 10152 --- [nio-8080-exec-7] c.g.m.timewriter.UserDetailsServiceImpl : User not found in database
Я также запустил свойприложение с дополнительным журналом отладки, чтобы увидеть запрос SQL, который был применен во время входа в систему.Я скопировал этот запрос в консоль H2, и там он создал мои учетные данные для входа.