¿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.
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>
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í:
Luego, en la clase
CommonLoggingFactory
, agregue la anotación@JsonSubTypes
para especificar los subtipos para cada ID de tipo de appender: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.