Question

J'ai quelques difficultés à utiliser le printemps de données mongodb 1.3.3.VERSION et de la version 1.6 de Java.

Ma configuration est un peu compliqué parce que j'ai à traiter avec des données existantes, j'ai donc personnalisé TypeMapper (extension de DefaultMongoTypeMapper) et deux différents de lecture/écriture convertisseur de combinaisons.De plus, j'ai utiliser @TypeAlias pour le réglage de la _class de l'information dans la base de données.

La problématique des modèles se compose de plusieurs listes imbriquées, certains sont typées comme

List<DocumentValue>

Monobjet peut contenir une liste d'objets

List<Object>

qui peut contenir un autre DocumentValue objet.

Cette installation semble fonctionner, les tests Unitaires fonctionner sans aucun problème, l'objet de mappage de l'air plutôt sympa dans le débogueur.Mon application est une application web et je suis capable d'écrire DocumentValues dans une collection, la _class l'information est présente.

Aussi longtemps je n'ai pas arrêter le serveur (un serveur tomcat dans mon cas), l'objet de cartographie des œuvres.Mais lorsque je redémarre le serveur (commencer une nouvelle JVM), DocumentValue les objets ne sont pas mappé correctement, mais sont traités comme des java.util.Map.L' _class l'information semble être ignoré.Je suppose qu'il pourrait y avoir un problème avec mon contexte de correspondance (mon modèle entités-être enregistré alors que le Printemps Contexte commencer?), mais je ne suis pas en mesure de trouver la configuration incorrecte.Quelqu'un a certains problèmes semblables ou a des suggestions?

Était-ce utile?

La solution

Merci pour votre réponse.Je crois que j'ai trouvé la raison pour laquelle _class a été ignorée.Vous avez raison, j'utilise une combinaison inhabituelle de TypeMapper.

Permettez-moi de vous montrer mon 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);

    }
}

À côté de la type le plus commun de la reconnaissance d'un truc, c'est le constructeur qui une MappingContextTypeInformationMapper est utilisé pour utiliser le @TypeAlias annotations.

La clé ici est la MongoMappongContext qui est nécessaire.Dans le non-fonctionnelles cas, j'ai initialisé le CustomTypeMapper comme

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

ce qui a fonctionné, mais a tort, parce que la nouvelle instance de MongoMappingContext ne contient pas de TypeInformation fournis par le réglage de la base-package attribut dans

<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>

Malheureusement je n'étais pas en mesure de savoir où l'MongoMappingContext est créé pour être en mesure de l'utiliser comme argument du constructeur, j'ai donc inventé un simple haricot MongoMappingContextProvider qui obtient le MongoMappingContext à l'aide de @Autowire

public class MongoMappingContextProvider {

    @Autowired
    private MongoMappingContext mappingContext;

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

}

Le Printemps de la configuration de la CustomTypeMapper regarde maintenant comme ceci

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

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

Cette solution fonctionne pour moi.

Par ailleurs, pour être sûr d'avoir tous les TypeInformations pour tout modèle de haricots j'utilise, j'ai ajouté @Document pour chaque modèle de bean qui est persistant - juste au cas où ;)

C'est peut-être utile pour quelqu'un d'autre à des problèmes similaires.

En ce qui concerne, Christoph

Autres conseils

Je soupçonne que le problème se produit en raison de la combinaison inhabituelle de TypeMapper l'utilisation et les convertisseurs. Si à la main, et mis en œuvre Converter exemple pour un type particulier est enregistrée, Converter est responsable de la création d'un objet permanent et lisible et de MongoDB.Cela signifie que votre convertisseur instance doit écrire les informations de type de lui-même.

Si vous ne pouvez pas l'obtenir pour fonctionner et peut compiler un petit exemple de projet de reproduire le problème (de préférence un cas de test à exécuter), n'hésitez pas à déposer un ticket dans notre JIRA exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top