Micronaut本机图像忽略属性



我正在尝试构建我的micronaut应用程序的graalvm本机映像。我看到了一个werid问题,即application.yaml中的一些属性被忽略,尽管当我通过运行应用程序时

/gradlew运行

一切正常。

这是我的yaml

micronaut:
application:
name: phonebook
caches:
phonebook:
charset: UTF-8
router:
static-resources:
swagger:
paths: classpath:META-INF/swagger
mapping: /swagger/**
swagger-ui:
paths: classpath:META-INF/swagger/views/swagger-ui
mapping: /doc/**
endpoints:
caches:
enabled: true
# sensitive: false
env:
enabled: true
# sensitive: false
fauna:
secret: '${FAUNA_KEY}'
endpoint: https://db.eu.fauna.com:443

以下是我如何读取类中的属性

@Value("${fauna.secret}")
private String faunaKey;
@Value("${fauna.endpoint}")
private String faunaEndpoint;

什么可能导致问题?

我知道不久前有人问过这个问题,但在花了几个小时找出一个非常相似的问题的解决方案后,我想在这里分享这个解决方案。

我发现graal编译器显然丢弃了任何私有字段,从而抛出了一个错误,表示类似于:

Caused by: java.lang.NoSuchFieldError: No field 'value1' found for type: com.example.ConferenceConfig

对我有效的解决方案是用@ReflectiveAccess对有问题的类进行注释。

然而,其他解决方案也起作用;使用构造函数注入或配置src/main/graal/reflect.json

@Factory
public class ConferenceConfig {
private final String value1;
public ConferenceConfig(@Value("${my.value1}") final String value1) {
this.value1 = value1;
}
@Context
public ConferenceConfigBean confBean() {
return new ConferenceConfigBean(value1);
}
public record ConferenceConfigBean(String value) {
public String getValue() {
return value;
}
}
}

这也适用于记录:

@Singleton
public record ConferenceService(@Value("${my.value1}") String value1) {

private static final List<Conference> CONFERENCES = Arrays.asList(
new Conference("Greach"),
new Conference("GR8Conf EU"),
new Conference("Micronaut Summit"),
new Conference("Devoxx Belgium"),
new Conference("Oracle Code One"),
new Conference("CommitConf"),
new Conference("Codemotion Madrid")
);
public Conference randomConf() {
return CONFERENCES.get(new Random().nextInt(CONFERENCES.size()));
}
public String getV1() {
return value1;
}
}

另一个

最新更新