Spring Data MongoDB no ve habilitado de forma predeterminada el convertidor Joda-Time
-
21-12-2019 - |
Pregunta
Intento simplemente guardar un documento con el campo org.joda.time.DateTime de Joda-Time.
@Document
public class JodaDoc {
@Id
private BigInteger id;
private String dateAsString;
private DateTime date;
public JodaDoc(String dateAsString, DateTime date) {
this.dateAsString = dateAsString;
this.date = date;
}
public BigInteger getId() { return id; }
public String getDateAsString() { return dateAsString; }
public DateTime getDate() { return date; }
}
Configuración de aplicación estándar usando AbstractMongoConfiguration de spring-data-mongodb:
@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }
Una prueba que usa explícitamente la clase AppConfig (con Spock, pero se usan mecanismos internos proporcionados por Spring-test):
@ContextConfiguration(classes = AppConfig)
class JodaDocRepositorySpec extends Specification {
@Autowired
private JodaDocRepository jodaDocRepository
def "save document with DateTime"() {
given:
def jodaDoc = new JodaDoc(DateTime.now())
when:
def savedJodaDoc = jodaDocRepository.save(jodaDoc)
then:
savedJodaDoc.id
}
}
Los convertidores Joda-Time en Spring Data MongoDB (y también en el propio Spring Core) deben habilitarse mediante por defecto cuando el jar Joda-Time está en un classpath.Desafortunadamente mi prueba falla con:
org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type org.joda.time.DateTime to type java.util.Date
Intenté agregar DefaultFormattingConversionService:
@Bean
public ConversionService conversionService() {
return new DefaultFormattingConversionService();
}
ConversionServiceFactoryBean y algunas otras cosas sin ningún efecto.No pude encontrar una respuesta en StackOverflow.
Pregunta.Por qué Spring Data MongoDB no ve un estándar org.joda.time.DateTime -> java.util.Date
convertidor?
Solución
Me tomó algo de tiempo y quiero compartir la solución con otros.
Creé una pequeña aplicación de inicio rápido y no pude reproducir el problema.Al final descubrí que el problema era que faltaba @Configuration
anotación en mi clase de configuración.Con:
@Configuration
@ComponentScan
@EnableMongoRepositories
public class AppConfig extends AbstractMongoConfiguration { ... }
simplemente funciona bien.
Muchas veces he omitido @Configuration
para la clase de configuración cuando está registrada explícitamente en el contexto (por clases en @ContextConfiguration
o un register()
método en AnnotationConfigWebApplicationContext)
.Las clases se procesaron de todos modos y se encuentran todos los beans declarados.A veces es útil no utilizar @Configuration
para evitar que un escaneo de componentes detecte cuando hay 2 clases de configuración similares en los mismos paquetes en un contexto de prueba utilizado por diferentes pruebas.generó otro pregunta ya que no estoy seguro de si es un comportamiento deseado.