Проблема
У меня возникла очень странная проблема при вызове метода save для моего встроенного в конструктор компонента репозитория. Я сузил проблему до JdkDynamicAopProxy, который является первым вызванным методом, видимым в обзоре фреймов intelliJ. Я поставил точку останова на первой строке метода invoke. От вызова до точки останова требуется более минуты. Ничего (заметно) не происходит между этими двумя кадрами.
Код
Контроллер
@Controller
class LoginController(private val userRepository: UserRepository, val passwordEncoder: PasswordEncoder) {
@PostMapping(value = ["/register"])
fun register(@RequestParam("mail") mail: String?, @RequestParam("password") pass: String?, model: Model) : ModelAndView
{
val modelAndView = ModelAndView("index")
if (mail == null || mail == "" || pass == null || pass == "") {
modelAndView.status = HttpStatus.NOT_ACCEPTABLE;
return modelAndView
}
// IT IS THE NEXT LINE WHICH IS CAUSING THE LONG WAIT...
userRepository.save(User(email = mail, password = passwordEncoder.encode(pass), newPassword = pass, firstname = "Test", lastname = "Persoon"))
modelAndView.status = HttpStatus.OK
return modelAndView
}
}
Пользовательский репозиторий
@Repository
interface UserRepository : JpaRepository<User, Long> {
fun findByEmail(email: String): User
}
application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/db?serverTimezone=GMT%2B1&useSSL=FALSE&allowPublicKeyRetrieval=true
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.hikari.connectionTimeout=20000
spring.datasource.hikari.maximumPoolSize=5
spring.datasource.hikari.poolName=Connections
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.thymeleaf.suffix=.xhtml
logging.level.org.springframework=INFO
logging.level.com.zaxxer=ERROR
logging.level.com.jenson=INFO
logging.level.root=ERROR
logging.level.org.hibernate.type=TRACE
Кадры
Из реестра: 33, loginController Для вызова: 157, JdkDynamicAopProxy Это занимает более 1 минуты.
Кажется, я не могу ввести этот один "кадр" между ..
Обзор последних кадров во время выполнения
РЕДАКТИРОВАТЬ: РЕШЕНИЕ В КОНЦЕ
Проблема была не в вызове, а в кодировании пароля.
Проблема была в компоненте BCryptEncoder.
fun bCryptEncoder() : PasswordEncoder = BCryptPasswordEncoder(20)
Проверка в исходном коде BCryptEncoder говорит мне, что 10 - сила пустого конструктора. Использование пустого конструктора и метода теперь занимает менее секунды.