Dans notre configuration, nous effectuons certaines étapes de construction STATIC-INIT, notamment l'ajout de tous les chemins de ressources à une liste dans un objet. Nous utilisons un enregistreur pour cela, car l'objet n'est pas accessible pendant la phase d'initialisation statique. En mode JVM, on voit que la liste contient bien tous les chemins de ressources. Cependant, ce n'est pas le cas en mode natif. La liste reste vide, même si les journaux de build montrent que nous avons parcouru les ressources et les avons ajoutées à la liste.

Voici à quoi ressemble notre configuration :

Premièrement : le fichier accessible au moment de l'exécution et contenant tous les chemins de ressources.

@ApplicationScoped
public class ServiceResourcesList {

    private List<String> resources;

    public ServiceResourcesList() {
        resources = new ArrayList<>();
    }

    public void addResource(String resource) {
        this.resources.add(resource);
    }

    public List<String> getResources() {
        return resources;
    }

    public List<String> getResources(Predicate<String> filter) {
        return resources.stream().filter(filter).collect(Collectors.toList());
    }
}

L'enregistreur, qui renvoie un BeanContainerListener :

@Recorder
public class ServiceResourcesListRecorder {

    public BeanContainerListener addResourceToList(String resource) {
        return beanContainer -> {
            ServiceResourcesList producer = beanContainer.instance(ServiceResourcesList.class);
            producer.addResource(resource);
        };
    }
}

Et enfin l'étape de construction (simplifiée). Notez que nous utilisons un BuildProducer qui doit s'assurer que les objets ont déjà été enregistrés avant d'appliquer les méthodes Recorder.

@BuildStep
@Record(STATIC_INIT)
void createResourceList(final BuildProducer<BeanContainerListenerBuildItem> containerListenerProducer, ServiceResourcesListRecorder recorder) {

    // Some code to get the resource paths, but this could be anything
    // ...

    for (String resourcePath: resourcePaths) {
        LOGGER.info(resourcePath + " added to recorder");
        containerListenerProducer.produce(new BeanContainerListenerBuildItem(recorder.addResourceToList(resourcePath)));
    }
}

Est-ce que je fais quelque chose de mal? Les enregistreurs ne sont-ils pas destinés à être utilisés pour les exécutables natifs ? Dois-je ajouter RegisterForReflection quelque part ?

Merci

1
Lukas Vanhoucke 4 sept. 2020 à 14:43

1 réponse

Meilleure réponse

Nous avons résolu ce problème en utilisant RUNTIME-INIT et des méthodes statiques à la place.

0
Lukas Vanhoucke 7 sept. 2020 à 11:13