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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top