Spring

java.lang.ClassCastException: com.sun.proxy.$Proxy62는 org.hibernate.engine.spi.SessionImplementor로 캐스팅할 수 없습니다.

기록만이살길 2022. 12. 12. 22:30
반응형

java.lang.ClassCastException: com.sun.proxy.$Proxy62는 org.hibernate.engine.spi.SessionImplementor로 캐스팅할 수 없습니다.

1. 질문(문제점):

Spring 및 Hibernate Search에 문제가 있습니다. 내 코드는 다음과 같습니다.

@Slf4j
@Repository
public class DefaultIndexBuilderDao implements IndexBuilderDao {

    @PersistenceContext
    @Getter
    @Setter
    private EntityManager entityManager;

    @Override
    public void rebuildIndex() {
        try {
            log.debug("Starting the reindex process...");
            FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(getEntityManager());
            fullTextEntityManager.createIndexer().startAndWait();
            log.debug("Reindex complete.");
        } catch( InterruptedException e ) {
            log.warn("Error rebuilding index: {}", e.getMessage(), e);
        }
    }
}

나는 받고있다 :

Caused by: java.lang.ClassCastException: com.sun.proxy.$Proxy62 cannot be cast to org.hibernate.engine.spi.SessionImplementor
    at org.hibernate.search.impl.FullTextSessionImpl.<init>(FullTextSessionImpl.java:62)
    at org.hibernate.search.impl.ImplementationFactory.createFullTextSession(ImplementationFactory.java:35)
    at org.hibernate.search.Search.getFullTextSession(Search.java:45)
    at com.domainwww.dao.DefaultIndexBuilderDao.rebuildIndex(DefaultIndexBuilderDao.java:38)
    at com.domainwww.service.DefaultIndexBuilderService.rebuildIndex(DefaultIndexBuilderService.java:30)
    at com.domainwww.beans.admin.IndexBean.reindex(IndexBean.java:29)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:247)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:107)
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
    ... 57 more

다음은 내 POM(속성)의 버전입니다(버전 충돌인 경우).

<spring.version>5.3.1</spring.version>
<hibernate.version>5.4.24.Final</hibernate.version>
<hibernate.search.version>5.11.7.Final</hibernate.search.version>

다음은 entityManager에 대한 빈입니다.

<bean id="entityManager" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" value="net.xxxx,com.xxxx.dbmanager3.settings" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
                <prop key="hibernate.dialect.storage_engine">innodb</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.connection.autocommit">false</prop>
                <prop key="hibernate.search.default.directory_provider">filesystem</prop>
                <prop key="hibernate.search.default.indexBase">/opt/xxx/lucene/indexes</prop>
            </props>
        </property>
    </bean>

그래서 저는 Spring이 프록시를 주입하고 있다는 것을 알았습니다. 그래서 FullTextEntityManager를 어떻게 얻어야 합니까? 감사!

2. 해결방안:

이것은 일반적으로 5.11.5.FinalSpring 부트 2.4/Spring 5.3과 함께 Hibernate Search 이하를 사용할 때 발생합니다. https://github.com/spring-projects/spring-framework/issues/26090 참조

ClassCastException에서 발생하는 경우 실제로 FullTextSessionImpl.java:62Hibernate Search를 사용하지 않는 것 같습니다 5.11.7.Final. Hibernate Search에서 5.11.7.Final이 줄은 테스트일 뿐입니다 instanceof. 아래 에서 5.11.5.Final이 줄은 실제로 캐스트입니다.

hibernate.search.version속성을 로 설정했지만 5.11.7.FinalPOM에서 이 속성을 사용했습니까? Spring Boot는 Hibernate Search에 대한 의존성을 관리하지 않으므로 마크업에서 직접 버전을 지정해야 합니다 <dependency>.

반응형