Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果没有Spring引导,泛型会失败吗?_Java_Spring_Generics_Jpa_Spring Boot - Fatal编程技术网

Java 如果没有Spring引导,泛型会失败吗?

Java 如果没有Spring引导,泛型会失败吗?,java,spring,generics,jpa,spring-boot,Java,Spring,Generics,Jpa,Spring Boot,我有这个配置类: @Configuration @Import(PersistenceConfiguration.class) public class DAOConfiguration { @PersistenceContext private EntityManager entityManager; @Bean public ClientDAO clientDAO() { SimpleJpaRepository<Client, Str

我有这个配置类:

@Configuration
@Import(PersistenceConfiguration.class)
public class DAOConfiguration {

    @PersistenceContext
    private EntityManager entityManager;

    @Bean
    public ClientDAO clientDAO() {
        SimpleJpaRepository<Client, String> support = this.getSimpleJpaRepository(Client.class);
        return new MySQLClientDAO(support);
    }

    @Bean
    @Scope(BeanDefinition.SCOPE_PROTOTYPE)
    @Description("Hibernate repository helper")
    protected <T> SimpleJpaRepository<T, String> getSimpleJpaRepository(Class<T> domainClass) {
        return new SimpleJpaRepository<T, String>(domainClass, this.entityManager);
    }

}
@配置
@导入(PersistenceConfiguration.class)
公共类配置{
@持久上下文
私人实体管理者实体管理者;
@豆子
公共ClientDAO ClientDAO(){
SimpleJpaRepository support=this.getSimpleJpaRepository(Client.class);
返回新的MySQLClientDAO(支持);
}
@豆子
@范围(BeanDefinition.Scope\u原型)
@说明(“Hibernate存储库帮助程序”)
受保护的SimpleParepository GetSimpleParepository(类domainClass){
返回新的SimpleParepository(domainClass,this.entityManager);
}
}
如果我用Spring Boot运行,一切正常。但如果我不这样做,我会得到一个例外:

Caused by: java.lang.ClassCastException: com.sun.proxy.$Proxy36 cannot be cast to org.springframework.data.jpa.repository.support.SimpleJpaRepository
    at com.example.movies.domain.config.DAOConfiguration$$EnhancerBySpringCGLIB$$248dfcc5.getSimpleJpaRepository(<generated>) ~[spring-core-4.1.6.RELEASE.jar:na]
    at com.example.movies.domain.config.DAOConfiguration.clientDAO(DAOConfiguration.java:27) ~[classes/:na]
    at com.example.movies.domain.config.DAOConfiguration$$EnhancerBySpringCGLIB$$248dfcc5.CGLIB$clientDAO$0(<generated>) ~[spring-core-4.1.6.RELEASE.jar:na]
    at com.example.movies.domain.config.DAOConfiguration$$EnhancerBySpringCGLIB$$248dfcc5$$FastClassBySpringCGLIB$$96fcb656.invoke(<generated>) ~[spring-core-4.1.6.RELEASE.jar:na]
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:309) ~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    at com.example.movies.domain.config.DAOConfiguration$$EnhancerBySpringCGLIB$$248dfcc5.clientDAO(<generated>) ~[spring-core-4.1.6.RELEASE.jar:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_75]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_75]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_75]
    at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_75]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
    ... 43 common frames omitted
16:31:50.506 [main] DEBUG o.s.t.c.s.DirtiesContextTestExecutionListener - After test class: context [DefaultTestContext@4ff04845 testClass = ClientDAOTest, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration@75c57e85 testClass = ClientDAOTest, locations = '{}', classes = '{class com.example.movies.domain.config.DAOConfiguration}', contextInitializerClasses = '[]', activeProfiles = '{}', propertySourceLocations = '{}', propertySourceProperties = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]], dirtiesContext [false].
原因:java.lang.ClassCastException:com.sun.proxy.$Proxy36无法强制转换为org.springframework.data.jpa.repository.support.SimpleParepository
在com.example.movies.domain.config.DAOConfiguration$$EnhancerBySpringCGLIB$$248dfcc5.getSimpleParepository()~[spring-core-4.1.6.RELEASE.jar:na]
在com.example.movies.domain.config.DAOConfiguration.clientDAO(DAOConfiguration.java:27)~[classes/:na]
在com.example.movies.domain.config.DAOConfiguration$$EnhancerBySpringCGLIB$$248dfcc5.CGLIB$clientDAO$0()~[spring-core-4.1.6.RELEASE.jar:na]
在com.example.movies.domain.config.DAOConfiguration$$EnhancerBySpringCGLIB$$248dfcc5$$FastClassBySpringCGLIB$$96fcb656.invoke()~[spring-core-4.1.6.RELEASE.jar:na]
在org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)~[spring-core-4.1.6.RELEASE.jar:4.1.6.RELEASE]
在org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:309)~[spring-context-4.1.6.RELEASE.jar:4.1.6.RELEASE]
在com.example.movies.domain.config.DAOConfiguration$$EnhancerBySpringCGLIB$$248dfcc5.clientDAO()~[spring-core-4.1.6.RELEASE.jar:na]
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.7.0_75]
在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)~[na:1.7.0\u 75]
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)~[na:1.7.0\u 75]
在java.lang.reflect.Method.invoke(Method.java:606)~[na:1.7.0_75]
在org.springframework.beans.factory.support.SimpleInstallationStrategy.instantiate(SimpleInstallationStrategy.java:162)~[spring-beans-4.1.6.RELEASE.jar:4.1.6.RELEASE]
... 省略了43个公共帧
16:31:50.506[main]调试o.s.t.c.s.DirtiesContextTestExecutionListener-测试后类:上下文[DefaultTestContext@4ff04845testClass=ClientDAOTest,testInstance=[null],testMethod=[null],testException=[null],mergedContextConfiguration=[MergedContextConfiguration@75c57e85testClass=ClientDAOTest,位置=“{}”,类=”{class com.example.movies.domain.config.DAOConfiguration}',ContextInitializerClass='[]',activeProfiles='{}',propertySourceLocations='{}',propertySourceProperties='{}',contextLoader='org.springframework.test.context.support.DelegatingSmartContextLoader',parent=[null]],dirtiesContext[false]。
你知道发生了什么吗?我太糊涂了…先谢谢你


编辑 这是一条失败的路线:

return new SimpleJpaRepository<T, String>(domainClass, this.entityManager);
返回新的SimpleParepository(domainClass,this.entityManager);

我想说,你的做法是错误的,你不应该乱搞
SimpleJampository
。你应该使用
@EnableJpaRepositories
,让它来完成工作

您应该做的是创建一个扩展Spring数据存储库接口之一的接口,并添加
@EnableJpaRepository
,基本上就是这样。不
MySQLClientDAO
只是一个在运行时为您提供实现的接口

public interface ClientDAO<Client, String> extends JpaRepository {... }
这基本上就是你所需要的

如果您有另一个存储库,您唯一需要做的就是添加另一个接口

public interface MovieDAO<Movie, String> extends CrudRepository { ... }
public interface MovieDAO扩展了crudepository{…}

我想说,你的做法是错误的,你不应该乱搞
SimpleJampository
。你应该使用
@EnableJpaRepositories
,让它来完成工作

您应该做的是创建一个扩展Spring数据存储库接口之一的接口,并添加
@EnableJpaRepository
,基本上就是这样。不
MySQLClientDAO
只是一个在运行时为您提供实现的接口

public interface ClientDAO<Client, String> extends JpaRepository {... }
这基本上就是你所需要的

如果您有另一个存储库,您唯一需要做的就是添加另一个接口

public interface MovieDAO<Movie, String> extends CrudRepository { ... }
public interface MovieDAO扩展了crudepository{…}

我想说,你的做法是错误的,你不应该乱搞
SimpleJampository
。你应该使用
@EnableJpaRepositories
,让它来完成工作

您应该做的是创建一个扩展Spring数据存储库接口之一的接口,并添加
@EnableJpaRepository
,基本上就是这样。不
MySQLClientDAO
只是一个在运行时为您提供实现的接口

public interface ClientDAO<Client, String> extends JpaRepository {... }
这基本上就是你所需要的

如果您有另一个存储库,您唯一需要做的就是添加另一个接口

public interface MovieDAO<Movie, String> extends CrudRepository { ... }
public interface MovieDAO扩展了crudepository{…}

我想说,你的做法是错误的,你不应该乱搞
SimpleJampository
。你应该使用
@EnableJpaRepositories
,让它来完成工作

您应该做的是创建一个扩展Spring数据存储库接口之一的接口,并添加
@EnableJpaRepository
,基本上就是这样