Ошибка обновления Spring Boot 4 с источником данных, проксируемым Javamelody (несоответствие Хикари)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Ошибка обновления Spring Boot 4 с источником данных, проксируемым Javamelody (несоответствие Хикари)

Сообщение Anonymous »

В настоящее время я использую Javamelody с загрузкой Spring 4.0.3
Я хотел добавить функцию обновления моих свойств конфигурации (загружаемых из файла и базы данных).
Используя PropertySourceLocator, я в порядке, но при вызове конечной точки привода/обновления источник данных обновляется, вызывая исключение.
Javamelody оборачивает/украшает источник данных с помощью прокси и Spring вызывает Bindable и теперь обнаруживает, что класс Proxy не является экземпляром HikariDatasource
В трекере Javamelody (2027/2018/2019) есть некоторые старые проблемы, связанные с прокси.
Одно из предлагаемых решений — использовать Spring.aop.proxy-target-class, но Spring doc вызывает некоторые проблемы, и если я правильно читаю документ, значение по умолчанию уже true
Какая конфигурация требуется, чтобы /actuator/refresh работал с источником данных, проксируемым Javamelody, в Spring Boot 4?
Вот пример build.gradle, созданный Spring Initialzr. При POST для /actuator/refresh
java.lang.IllegalArgumentException: 'existingValue' must be an instance of com.zaxxer.hikari.HikariDataSource
at org.springframework.util.Assert.isTrue(Assert.java:136) ~[spring-core-7.0.7.jar:7.0.7]
at org.springframework.boot.context.properties.bind.Bindable.withExistingValue(Bindable.java:195) ~[spring-boot-4.0.6.jar:4.0.6]
at org.springframework.boot.context.properties.ConfigurationPropertiesBean.get(ConfigurationPropertiesBean.java:210) ~[spring-boot-4.0.6.jar:4.0.6]

При отладке используется метод boxedTypeIsInstanceOf, который проверяет экземпляр.
Assert.isTrue(existingValue == null || this.type.isArray() || boxedTypeIsInstanceOf(existingValue),
() -> "'existingValue' must be an instance of " + this.type);

Build.gradle:
plugins {
id 'java'
id 'org.springframework.boot' version '4.0.6'
id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

repositories {
mavenCentral()
}

ext {
set('springCloudVersion', "2025.1.1")
}

dependencies {
implementation 'org.springframework.cloud:spring-cloud- starter'
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter- actuator'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
implementation 'net.bull.javamelody:javamelody-spring-boot4-starter:2.6.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud- dependencies:${springCloudVersion}"
}
}

tasks.named('test') {
useJUnitPlatform()
}

В моем application.yml я определил источник данных и открыл конечные точки обновления.
management.endpoints.web.exposure.include: info, health, refresh
Ответить

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

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

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

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

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