Primavera de Dados MongoDB ignora _class informações
-
20-12-2019 - |
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 DocumentValue
s 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?
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.