2014-09-07 1 views
0

Hibernate NamedQuery 및 MongoDB를 사용하여 매우 간단한 쿼리를 실행하려고합니다. 그러나 ENUM 필드를 WHERE 조건에 추가하려고 할 때 아래 예외가 throw됩니다. 조건이 예상대로 작동 WHERE에 열거하지 않고json은 MONGODB 및 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) 

ENTITY

@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; 
    } 

} 

DAO :

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(); 
    } 

답변

0

는 개체와 함께 사용 ENUM의 예있다. 코드에서 enum 클래스는 엔터티의 내부 클래스입니다.

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

public static enum SocialProvider { 

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

    private String name; 

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

    public String getName() { 
     return name; 
    } 
} 

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

필자는 테스트하지 않았지만 해결하기 전에이 버그의 해결 방법이 될 수 있습니다.

관련 문제