我不确定这是一个错误。事实上,这可能是预期的行为。
假设我具有以下配置类
@ConfigurationProperties("app")
public class ApplicationConfiguration {
public String uri = "/api/v1";
// I also tested with optional, no difference
// public Optional<String> uri = Optional.of("/api/v1");
}
然后在控制器上使用注释@Controller("${app.uri}/some/path")
。
如果我没有在application.yml
中添加条目,那么我将遇到以下错误:
Could not resolve placeholder ${app.uri} in value: ${app.uri}/some/path
如果我将以下几行添加到application.yml
app:
uri: /api/v2
然后一切正常:占位符解析为/api/v2
,并且可注入配置对象中的值也设置为/api/v2
,而不是默认值/api/v1
。
我希望,如果我没有在application.yml
中设置值,则该类中的默认值将已经解析(/api/v1
)。
同样,这可能只是设计使然,这很好。我只是想知道我是否做错了什么,在这种情况下,如何解决。
答案 0 :(得分:2)
这是预期的行为。知道属性在配置类中是否具有默认值是不可行的。要在这种情况下提供默认值,只需执行以下操作:
@Controller("${app.uri:/api/v1}/some/path")
答案 1 :(得分:0)
Micronaut是基于注释的,因此您只需添加注释
@Nullable
连同您的@Property批注一起使用,以防止编译错误。
还可以在配置类中执行以下操作:
@ConfigurationProperties("app")
public class ApplicationConfiguration {
@Nullable
public String uri = "/api/v1";
public String getUri() {
return uril?: "/api/v1"
}
}
答案 2 :(得分:0)
请查看micronaut configuration的最新文档,以下内容应该有效。
import io.micronaut.context.annotation.ConfigurationProperties
import javax.validation.constraints.Min import javax.validation.constraints.NotBlank
@ConfigurationProperties('my.engine')
class EngineConfig {
@NotBlank
String manufacturer = "Ford"
@Min(1L)
int cylinders
CrankShaft crankShaft = new CrankShaft()
@ConfigurationProperties('crank-shaft')
static class CrankShaft {
Optional<Double> rodLength = Optional.empty()
}
}