es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué la deserialización de Dropwizard no encuentra un appender cuando simplemente extiendo el registrador predeterminado?

Tengo un archivo YML de configuración que incluye el registro de Dropwizard, así:

logging:
  level: WARN
  loggers:
    com.<compañía>.<producto>: INFO
  appenders:
    - type: console
(etc)

Tengo una clase sencilla para leer el archivo YAML y una clase como esta:

public class MyConfiguration {

    private CommonLoggingFactory loggingFactory;

    public MyConfiguration() {

    }

    public MyConfiguration(CommonLoggingFactory loggingFactory) {
        this.loggingFactory = loggingFactory;
    }

    @JsonProperty("logging")
    public CommonLoggingFactory getLoggingFactory() {
        return loggingFactory;
    }

    @JsonProperty("logging")
    public void setLoggingFactory(CommonLoggingFactory loggingFactory) {
        this.loggingFactory = loggingFactory;
    }
}

siendo mi nueva clase de fábrica de registros así:

@JsonTypeName("logging")
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type", defaultImpl = CommonLoggingFactory.class)
public class CommonLoggingFactory extends DefaultLoggingFactory {

    //TODO Cualquier cambio
}

donde DefaultLoggingFactory es io.dropwizard.logging.DefaultLoggingFactory.

Así que parece que el deserializador (jackson) puede encontrar DefaultLoggingFactory, pero luego no sigue la cadena hasta los appenders.

No se pudo resolver el identificador de tipo ‘console’ como un subtipo de io.dropwizard.logging.AppenderFactory<ch.qos.logback.classic.spi.iloggingevent>: ids de tipo conocidos = [] (para la propiedad POJO ‘appenders’)
en [Origen: (Archivo); línea: 80, columna: 1] (a través de la cadena de referencia: com..MyConfiguration[“logging”]->com..CommonLoggingFactory[“appenders”]->java.util.ArrayList[0])

Hubiera pensado que sería captado automáticamente. He intentado algunas cosas como https://stackoverflow.com/questions/38380412/how-to-configure-jackson-to-deserialize-named-types-with-default-typing/38417267#38417267 diciéndole al mapeador de objetos que asocie “console” con ConsoleAppenderFactory.class, pero no tuve éxito.

¿Alguna idea?</ch.qos.logback.classic.spi.iloggingevent>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que podría haber un problema con el ID de tipo que no es reconocido por el deserializador. Una posible solución sería agregar el ID de tipo para el appender al archivo YML, así:

    logging:
      level: WARN
      loggers:
        com.<company>.<product>: INFO
      appenders:
        - type: console
          type-id: console-appender
    

    Luego, en la clase CommonLoggingFactory, agregue la anotación @JsonSubTypes para especificar los subtipos para cada ID de tipo de appender:

    @JsonSubTypes({
        @JsonSubTypes.Type(value = ConsoleAppenderFactory.class, name = "console-appender"),
        // agregar subtipos para otros tipos de appender aquí
    })
    public class CommonLoggingFactory extends DefaultLoggingFactory {
        // TODO cambios necesarios
    }
    

    Esto debería indicar al deserializador que identifique correctamente el subtipo del appender en función del ID de tipo especificado en el archivo YML.

Comments are closed.