Pergunta

Eu tenho alguns problemas com a utilização de primavera-dados mongodb 1.3.3.LANÇAMENTO e Java 1.6.

Minha configuração é um pouco complicada, porque eu tenho que lidar com o legado de dados, assim que eu tiver personalizado TypeMapper (estendendo-se DefaultMongoTypeMapper) e dois diferentes de leitura/gravação conversor de combinações.Além disso eu uso @TypeAlias para definir o _class informações no banco de dados.

Os modelos problemáticos consiste em várias listas aninhadas, alguns são escritos como

List<DocumentValue>

Meuobjeto pode conter uma lista de objetos

List<Object>

o que pode conter outro DocumentValue objecto.

Esta configuração parece funcionar, testes de Unidade de execução, sem qualquer problema, o objeto de mapeamento parece bastante agradável no depurador.Minha aplicação é uma aplicação web e eu sou capaz de escrever DocumentValues em uma coleção, o _class a informação está presente.

Quanto tempo eu não desligar o servidor (tomcat no meu caso), o objeto de mapeamento de obras.Mas quando eu reiniciar o servidor (iniciar uma nova JVM), DocumentValue objetos não são mapeados corretamente, mas são tratados como java.util.Map.O _class a informação parece ser ignorado.Eu suponho que não poderia ser um problema com o meu mapeamento de contexto (o meu modelo de entidades ser registrados durante a Primavera Contexto começar?), mas eu não sou capaz de encontrar a configuração incorreta.Será que ninguém tem alguns problemas semelhantes ou tem alguma sugestão?

Foi útil?

Solução

Obrigado pela sua resposta.Eu acho que eu encontrei a razão pela qual _class foi ignorada.Você está certo, eu uso uma combinação incomum de TypeMapper.

Deixe-me mostrar-lhe o meu CustomTypeMapper:

public class CustomTypeMapper extends DefaultMongoTypeMapper {

    public CustomTypeMapper (MongoMappingContext mappingContext) {

        super(DEFAULT_TYPE_KEY,
                Arrays.asList(new MappingContextTypeInformationMapper(
                        mappingContext)));
    }

    @Override
    public <T> TypeInformation<? extends T> readType(DBObject source,
            TypeInformation<T> basicType) {

        // do some custom recognition

                // or just to the common type mapping
        return super.readType(source, basicType);

    }
}

Ao lado o tipo comum de reconhecimento de uma coisa especial é o construtor em que um MappingContextTypeInformationMapper é usado para usar o @TypeAlias anotações.

A chave aqui é a MongoMappongContext que é necessário.No não-funcionais caso eu inicializado o CustomTypeMapper como

<bean id="customTypeMapper" class="de.flexguse.repository.CustomTypeMapper">
    <constructor-arg name="mappingContext">
        <bean class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
    </constructor-arg>
</bean>

o que funcionou, mas estava errado, porque a nova instância do MongoMappingContext não conter qualquer TypeInformation fornecida pela definição de base-package atributo em

<mongo:mapping-converter id="customMappingConverter" db-factory-ref="mongoDbFactory"
        type-mapper-ref="customTypeMapper" base-package="de.flexguse.model" >

    <mongo:custom-converters>
            ... some custom converters ...
    </mongo:custom-converters>

</mongo:mapping-converter>

Infelizmente, eu não era capaz de descobrir onde está o MongoMappingContext é criado para ser capaz de usá-lo como argumento do construtor, então eu inventei um simples feijão MongoMappingContextProvider que recebe a MongoMappingContext usando @Autowire

public class MongoMappingContextProvider {

    @Autowired
    private MongoMappingContext mappingContext;

    /**
     * @return the mappingContext
     */
    public MongoMappingContext getMappingContext() {
        return mappingContext;
    }

}

A Primavera de configuração do CustomTypeMapper olha agora como este

<bean id="mongoMappingContextProvider" class="de.flexguse.repository.MongoMappingContextProvider" />

<bean id="customTypeMapper" class="de.flexguse.repository.CustomTypeMapper">
    <constructor-arg name="mappingContext" value="#{mongoMappingContextProvider.mappingContext}" />
</bean>

Esta solução funciona para mim.

A propósito, para ter a certeza de ter todos os TypeInformations para todos os modelo de grãos de eu usar eu adicionei @Documento para cada modelo de bean, que é persistente, para o caso ;)

Talvez isso seja útil para alguém com problemas semelhantes.

Cumprimentos, Christoph

Outras dicas

Eu suspeito que o problema ocorra devido à combinação incomum de TypeMapper uso e conversores. Se uma implementado manualmente Converter exemplo para um determinado tipo é registrado, que Converter é responsável para criar um objeto persistente e legível, e o MongoDB.Isto significa que o conversor de instância necessitar de escrever o tipo de informações em si.

Se você não pode fazê-lo funcionar e pode compilar um pequeno projecto de exemplo para reproduzir o problema (de preferência um caso de teste para executar), sinta-se livre para arquivo um ticket no nosso JIRA instância.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top