According to this documentation, I should be able to use @DurationUnit
to change the default unit when converting a duration. However, the example above keeps using MILLISECONDS
as the duration unit.
Happening in the latest
Spring version
1) When not specifying a unit in application.yml
:
myconfig:
myDuration: 70
2) And specifying DurationUnit
to SECONDS
in config properties class
@ConstructorBinding
@ConfigurationProperties("myconfig")
class MyProperties(
@DurationUnit(ChronoUnit.SECONDS)
val myDuration: Duration,
)
3) Then duration is converted using default MILLISECONDS
unit
myProperties.myDuration.toString() // -> "PT0.07S"
Comment From: jordigarcl
Also, I don't understand why the current documentation provides this example:
@ConfigurationProperties("app.system")
public class AppSystemProperties {
@DurationUnit(ChronoUnit.SECONDS)
private Duration sessionTimeout = Duration.ofSeconds(30);
}
Why is it programmatically setting Duration.ofSeconds(30)
? Isn't the whole purpose to use the properties
value?
Comment From: wilkinsona
Duration.ofSeconds(30)
is the default value for the app.system.sessionTimeout
property.
Comment From: wilkinsona
This has been addressed in 2.4 where @DurationUnit
can now be used on constructor parameters. I think we still need to do something in a maintenance branch, though. The problem isn't specific to Kotlin as the following Java does not work either:
@DurationUnit(ChronoUnit.SECONDS)
private final Duration duration;
public MyProperties(Duration duration) {
this.duration = duration;
}
We can't be sure that the duration
constructor parameter will be stored in the duration
field so there's no way of reliably discovering the duration unit. I suspect the best that we can do is to update the documentation to make it clear that @DurationUnit
is only supported with JavaBean-based property binding.