Как вы используете Spring Boot Configuration Processor с Gradle?
Итак, мы имеем нашу конфигурацию часового в файле с именем sentryconfig.properties
dsn=https://blahblahblah@sentry.io/1234567
stacktrace.app.packages=ch.cypherk.myapp
async.shutdowntimeout=5000
(не sentry.properties
потому что мы не хотим включать автоматическую настройку Sentry, поэтому мы можем отключить ее в непроизводственных профилях).
Это означает, что мы должны инициализировать Sentry сами...
Это работает как задумано:
@Configuration
@PropertySource("classpath:sentryconfig.properties")
@Profile("prod")
public class SentryConfiguration {
private static final Logger LOG = LoggerFactory.getLogger(SentryConfiguration.class);
private final VersionInfo versionInfo;
private final String dsn;
private final String stacktrace_app_packages;
private final int async_shutdowntimeout;
public SentryConfiguration(
VersionInfo versionInfo,
@Value("${dsn}") String dsn,
@Value("${stacktrace.app.packages}") String stacktrace_app_packages,
@Value("${async.shutdowntimeout}") int async_shutdowntimeout
) {
this.versionInfo = versionInfo;
this.dsn = dsn;
this.stacktrace_app_packages = stacktrace_app_packages;
this.async_shutdowntimeout = async_shutdowntimeout;
}
@PostConstruct
public void initSentry() {
String sentryUrl = String.format("%s?stacktrace.app.packages=%s&async.shutdowntimeout=%d",
dsn, stacktrace_app_packages, async_shutdowntimeout
);
LOG.info("Initializing Sentry: " + sentryUrl);
Sentry.init(sentryUrl);
SentryClient client = Sentry.getStoredClient();
client.setRelease(versionInfo.getVersion());
}
}
Но руководитель команды слышал о @ConfigurationProperties
и хочет, чтобы я использовал это.
Это я еще не совсем понял.
Я прочитал это и это, и процесс кажется довольно простым, на самом деле:
Мы добавляем sentry.
префикс к нашим свойствам (потому что @ConfigurationProperties
требуется непустой префикс)
sentry.dsn=https://blahblahblah@sentry.io/1234567
sentry.stacktrace.app.packages=ch.cypherk.myapp
sentry.async.shutdowntimeout=5000
А затем бросить
implementation("org.springframework.boot:spring-boot-configuration-processor")
в наш build.gradle
файл.
(Я также пытался использовать annotationProcessor
вместо implementation
как предложено здесь, но это ничего не изменило)
и, наконец, удалите свойства из конструктора и добавьте @ConfigurationProperties
а также @EnableConfigurationProperties
аннотаций):
@Configuration
@EnableConfigurationProperties
@PropertySource("classpath:sentryconfig.properties")
@ConfigurationProperties("sentry")
@Profile("prod")
public class SentryConfiguration {
private static final Logger LOG = LoggerFactory.getLogger(SentryConfiguration.class);
private final VersionInfo versionInfo;
private String dsn;
private String stacktrace_app_packages;
private int async_shutdowntimeout;
public SentryConfiguration(
VersionInfo versionInfo
) {
this.versionInfo = versionInfo;
}
@PostConstruct
public void initSentry() {
String sentryUrl = String.format("%s?stacktrace.app.packages=%s&async.shutdowntimeout=%d",
dsn, stacktrace_app_packages, async_shutdowntimeout
);
LOG.info("Initializing Sentry: " + sentryUrl);
Sentry.init(sentryUrl);
SentryClient client = Sentry.getStoredClient();
client.setRelease(versionInfo.getVersion());
}
}
Затем пересоберите проект, запустите и...
io.sentry.SentryClientFactory: Error creating valid DSN from: 'null?stacktrace.app.packages=null&async.shutdowntimeout=0'
Хорошо, поэтому я был готов изменить имена stacktrace_app_packages
а также async_shutdowntimeout
если весна не поднимет подчеркивания, но я не ожидал dsn
быть нулевым тоже.
Я получаю уведомление IntelliJ о том, что
Перезапустите обработчик аннотаций конфигурации Spring Boot, чтобы обновить сгенерированные метаданные
Я ожидал, что это произойдет, когда я перестрою проект.
Кажется, это не так.
Как мне заставить это работать?