2014-09-07 3 views
0

J'essaie d'exécuter une requête très simple en utilisant Hibernate NamedQuery et MongoDB. Cependant, lorsque j'essaie d'ajouter un champ ENUM dans la condition WHERE, il crée une exception ci-dessous. Sans ENUM dans WHERE fonctionne comme prévujson ne peut pas sérialiser le type avec MONGODB et Hibernate-OGM

java.lang.RuntimeException: json can't serialize type : class com.entity.model.social.SocialProvider 
    at com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:77) 
    at com.mongodb.util.JSONSerializers$MapSerializer.serialize(JSONSerializers.java:317) 
    at com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:79) 
    at com.mongodb.util.JSONSerializers$IterableSerializer.serialize(JSONSerializers.java:290) 
    at com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:79) 
    at com.mongodb.util.JSONSerializers$MapSerializer.serialize(JSONSerializers.java:317) 
    at com.mongodb.util.ClassMapBasedObjectSerializer.serialize(ClassMapBasedObjectSerializer.java:79) 
    at com.mongodb.util.JSON.serialize(JSON.java:55) 
    at com.mongodb.util.JSON.serialize(JSON.java:40) 
    at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:78) 
    at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:66) 
    at com.mongodb.DBCursor._check(DBCursor.java:458) 
    at com.mongodb.DBCursor._hasNext(DBCursor.java:546) 
    at com.mongodb.DBCursor.hasNext(DBCursor.java:571) 
    at org.hibernate.ogm.datastore.mongodb.MongoDBDialect$MongoDBResultsCursor.hasNext(MongoDBDialect.java:860) 
    at org.hibernate.ogm.query.impl.OgmQueryLoader.listOfEntities(OgmQueryLoader.java:88) 
    at org.hibernate.ogm.query.impl.OgmQueryLoader.list(OgmQueryLoader.java:76) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:496) 
    at org.hibernate.ogm.query.impl.OgmQueryTranslator.list(OgmQueryTranslator.java:126) 
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:231) 
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264) 
    at org.hibernate.internal.QueryImpl.list(QueryImpl.java:103) 
    at org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573) 
    at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:495) 
    at com.dao.social.SocialConnectionDao.getConnectionByUserId(SocialConnectionDao.java:37) 
    at com.service.social.SocialConnectionServiceImpl.getConnectionByUserId(SocialConnectionServiceImpl.java:39) 
    at com.service.social.SocialConnectionServiceImpl$$FastClassBySpringCGLIB$$1d9a6b18.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:708) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644) 
    at com.service.social.SocialConnectionServiceImpl$$EnhancerBySpringCGLIB$$7583977a.getConnectionByUserId(<generated>) 
    at test.com.TestSocialConnection.listSocialConnections(TestSocialConnection.java:60) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:233) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:87) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:176) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

ENTITÉ

@Entity 
@Indexed(index="social_connection") 
@NamedQueries({ 
    @NamedQuery(name = "social.getConnectionUserById", query = "select s from SocialConnection s where s.provider = :provider and s.providerUserId = :providerUserId") 
}) 
@Table(name = "social_connection") 
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.NONE, getterVisibility = JsonAutoDetect.Visibility.NONE, isGetterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE) 
public class SocialConnection extends DateEntity { 


    private static final transient Logger LOG = LoggerFactory.getLogger(SocialConnection.class); 

    private SocialProvider provider; 

    private String providerUserId; 


    public SocialConnection() { 
    } 


    @Enumerated(EnumType.STRING) 
    @NotNull 
    public SocialProvider getProvider() { 
     return provider; 
    } 

    public void setProvider(SocialProvider provider) { 
     this.provider = provider; 
    } 

    @NotNull 
    public String getProviderUserId() { 
     return providerUserId; 
    } 

    public void setProviderUserId(String providerUserId) { 
     this.providerUserId = providerUserId; 
    } 

ENUM

public enum SocialProvider { 

    TWITTER("Twitter"), 
    FACEBOOK("Facebook"), 
    LINKEDIN("LinkedIn"); 

    private String name; 

    SocialProvider(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

} 

OAC:

public SocialConnection getConnectionByUserId(SocialProvider provider, String userId) {  
     TypedQuery<SocialConnection> namedQuery = entityManager.createNamedQuery("social.getConnectionUserById", SocialConnection.class); 
     namedQuery.setParameter("provider", provider); 
     namedQuery.setParameter("providerUserId", userId); 
     namedQuery.setMaxResults(1); 
     return namedQuery.getSingleResult(); 
    } 

Répondre

0

Dans le livre « Pro Mise en veille prolongée et MongoDB », il est un exemple de ENUM utilisé avec l'entité. Dans leur code, la classe enum est une classe interne de l'entité. Je n'ai pas testé, mais peut-être que ce pourrait être une solution de contournement pour ce bogue avant qu'il ne soit corrigé.

Questions connexes