Jackson `InvalidDefinitionException` Mit Graalvm Native Image:" Kann keine Instanz konstruieren ... kein delegierter odeJava

Java-Forum
Anonymous
 Jackson `InvalidDefinitionException` Mit Graalvm Native Image:" Kann keine Instanz konstruieren ... kein delegierter ode

Post by Anonymous »

Ich erstelle ein Graalvm -natives Bild für ein Quarkus/Java 21 -Projekt und stößt auf Jackson Deserialization -Probleme, die bei JVM einwandfrei funktionieren.

Code: Select all

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot construct instance of `com.example.config.models.Configuration`:
cannot deserialize from Object value (no delegate- or property-based Creator):
this appears to be a native image, in which case you may need to configure reflection
at [Source: (ByteArrayInputStream); line: 1, column: 1]
< /code>
Voller Stapel -Trace -Auszug: < /p>
com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition
com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition
com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator
com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault
com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject
com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize
com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.readRootValue
com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose
com.fasterxml.jackson.databind.ObjectMapper.readValue
com.example.config.ConfigurationLoader.loadConfigurationFromYaml
com.example.config.HttpConfigurationLoader.loadConfiguration
com.example.config.AppProps.initialize
...
What I tried
  • Added reflect-config.json under src/main/resources/META-INF/native-image/ with entries like:

Code: Select all

[
{
"name":"com.example.config.models.Configuration",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"queryAllDeclaredConstructors":true,
"methods":[{"name":"","parameterTypes":["java.util.Map"] }]
},
{
"name":"com.example.config.models.Configuration$Destination",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"queryAllDeclaredConstructors":true,
"methods":[{"name":"","parameterTypes":["java.lang.String","java.lang.String","int","java.lang.String","java.lang.String","java.lang.String","int","int","int","int"] }]
},
{
"name":"com.example.config.models.Configuration$Environment",
"allDeclaredFields":true,
"queryAllDeclaredMethods":true,
"queryAllDeclaredConstructors":true,
"methods":[{"name":"","parameterTypes":["com.example.config.models.Configuration$Destination"] }]
},
{
"name":"com.example.config.HttpConfigurationLoader",
"allDeclaredConstructors": true,
"allDeclaredMethods": true,
"allDeclaredFields": true
},
{
"name": "com.fasterxml.jackson.annotation.JsonCreator"
}
]

Die JSON-Struktur ist gültig und unter meta-inf/native-image . InvalidDefinitionException < /code>. < /Li>
< /ul>

Frage < /h3>
Da die Konfiguration und verwandte Klassen aus einer Abhängigkeit von Drittanbietern stammen, können sie von einer Drittanbieter-Abhängigkeit stammen (ich kann sie nicht modifizieren, um Annotationen oder Konstruktoren zu addieren). /> Gibt es eine Möglichkeit, Reflexionskonfiguration automatisch für Abhängigkeitsklassen von Jackson zu generieren? Ich habe automatisch den Reflect-config.json und andere über den Agentenmodus generiert und sie unter src \ main \ ressourcen \ meta-inf \ natives Image \
gebraucht. Muss ich meinen eigenen Mixin- oder benutzerdefinierten Deserializer erstellen. Bilder?

Code: Select all

// Dummy dependency-like classes (cannot modify these)
package com.example.dep.config.models;

import java.util.Map;

public class Configuration {
private Map bootstrapConfig;

public Map getBootstrapConfig() { return bootstrapConfig; }
public void setBootstrapConfig(Map bootstrapConfig) { this.bootstrapConfig = bootstrapConfig; }

public static class [url=viewtopic.php?t=25360]Environment[/url] {
private Destination destination;
public Destination getDestination() { return destination; }
public void setDestination(Destination destination) { this.destination = destination; }
}

public static class Destination {
private String protocol;
private String host;
private int port;

public String getProtocol() { return protocol; }
public void setProtocol(String protocol) { this.protocol = protocol; }

public String getHost() { return host; }
public void setHost(String host) { this.host = host; }

public int getPort() { return port; }
public void setPort(int port) { this.port = port; }
}
}
< /code>
// Loader that uses Jackson to read YAML
package com.example.dep.config;

import com.example.dep.config.models.Configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;

import java.io.IOException;
import java.io.InputStream;

public class ConfigurationLoader {
private static final ObjectMapper MAPPER = new ObjectMapper(new YAMLFactory());

public Configuration loadConfiguration(String environment) throws IOException {
try (InputStream fileStream = Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream("config.yaml")) {
return MAPPER.readValue(fileStream, Configuration.class);
}
}
}
< /code>
// Utility class similar to AppProps in dependency lib
package com.example.dep.config;

import com.example.dep.config.models.Configuration;
import lombok.experimental.UtilityClass;

@UtilityClass
public class AppProps {

private static Configuration configuration;
private static Configuration.Destination currentDestination;
private static ConfigurationLoader loader;

public static void initialize() throws IOException {
loader = new ConfigurationLoader();
configuration = loader.loadConfiguration("dev"); // [url=viewtopic.php?t=25360]environment[/url] dummy
}

public static Configuration getConfiguration() {
return configuration;
}

public static Configuration.Destination getCurrentDestination() {
currentDestination = configuration.getBootstrapConfig().get("dev").getDestination();
return currentDestination;
}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post