【问题标题】:Implementing CrudeRepository with an interface and Long使用接口和 Long 实现 CrudeRepository
【发布时间】:2021-03-10 12:49:03
【问题描述】:

我正在尝试实现一个通用的原始存储库,但 Spring Boot 给出了一个“非托管类型”异常 - 在我正在参数化我的 CrudeRepository 的那个接口 (IStorable) 上。如果这里有人可以帮助我,我将不胜感激。谢谢!

我有我的回购:

 package com.project.biddingSoft.dao;
    public interface IRepo extends CrudRepository<IStorable, Long> {
    }

然后我有我的界面:

  package com.project.biddingSoft.model;
    public interface IStorable {
        public Long getId() ;
    }

之后我有了我的实体类:

   package com.project.biddingSoft.model;
    @Entity
    public class Lot implements IStorable {

    @Override
    public Long getId() {
        return id;
    }
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private  Long id;

    setters, getters and attributes as usual..
    
    }

这是主类:

   package com.project.biddingSoft;
    @SpringBootApplication(exclude = {SecurityAutoConfiguration.class })
    public class BiddingSoftwareApplication implements CommandLineRunner {
        public static void main(String[] args) {
            SpringApplication.run(BiddingSoftwareApplication.class, args);
            
        }

这是控制器(解释我的意图):

package com.project.biddingSoft.controller;
public class ServletInitializer extends SpringBootServletInitializer {
  
    @Autowired
    private DaoServiceImpl daoServiceImpl;
   
   configure method etc..

    @PostMapping(path = "/addent")
    ResponseEntity<Object> addNewEntity(@RequestBody IStorable entity) {

        try {
            
            daoServiceImpl.persistEntity(entity);
        } catch (IllegalArgumentException e) {
            throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, e.getMessage());
        }

        return new ResponseEntity("Object updated successfully", HttpStatus.CREATED);

    }
}

还有我的服务:

package com.project.biddingSoft.service;
public class DaoServiceImpl {

    @Autowired
    private IRepo iRepo; 
    
    public  boolean persistEntity(IStorable entity ) throws IllegalArgumentException {
         
        try {
            IStorable success = iRepo.save(entity);
        }
        catch(IllegalArgumentException e) {
            logger.info("Error is " ,e);
            throw e; 
        }
        return true; 
        
    }
}

这是我得到的错误:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
12:04:51.237 [restartedMain] ERROR o.s.boot.SpringApplication - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'servletInitializer': Unsatisfied dependency expressed through field 'daoServiceImpl'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'daoServiceImpl': Unsatisfied dependency expressed through field 'iRepo'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IRepo' defined in com.project.biddingSoft.dao.IRepo defined in @EnableJpaRepositories declared on BiddingSoftwareApplication: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: interface com.project.biddingSoft.model.IStorable
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:660)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1413)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:917)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:326)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300)
    at com.project.biddingSoft.BiddingSoftwareApplication.main(BiddingSoftwareApplication.java:29)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'daoServiceImpl': Unsatisfied dependency expressed through field 'iRepo'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IRepo' defined in com.project.biddingSoft.dao.IRepo defined in @EnableJpaRepositories declared on BiddingSoftwareApplication: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: interface com.project.biddingSoft.model.IStorable
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:660)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1413)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1380)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657)
    ... 26 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IRepo' defined in com.project.biddingSoft.dao.IRepo defined in @EnableJpaRepositories declared on BiddingSoftwareApplication: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: interface com.project.biddingSoft.model.IStorable
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1786)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:602)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1380)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657)
    ... 40 common frames omitted
Caused by: java.lang.IllegalArgumentException: Not a managed type: interface com.project.biddingSoft.model.IStorable
    at org.hibernate.metamodel.internal.MetamodelImpl.managedType(MetamodelImpl.java:582)
    at org.hibernate.metamodel.internal.MetamodelImpl.managedType(MetamodelImpl.java:85)
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:75)
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:66)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:229)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:179)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:162)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:72)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:281)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:323)
    at org.springframework.data.util.Lazy.getNullable(Lazy.java:230)
    at org.springframework.data.util.Lazy.get(Lazy.java:114)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:329)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:144)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1845)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1782)
    ... 50 common frames omitted

编辑:

我尝试将 IStorable 更改为 Storable 并让我的实体类扩展它而不是 IStorable:

@MappedSuperclass
public  class Storable {
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    protected  Long id;
    
    public void setId(Long id) {
        this.id = id;
    }
    public Long getId() {
        return id;
    }
}

但是现在我在邮递员中发出我的帖子请求时收到以下错误:

 "status": 500,
    "error": "Internal Server Error",
    "trace": "org.springframework.dao.InvalidDataAccessApiUsageException: Unknown entity: com.project.biddingSoft.domain.Storable; nested exception is java.lang.IllegalArgumentException: Unknown entity: com.project.biddingSoft.domain.Storable\r\n\tat org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374)\r\n\tat org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:235)\r\n\tat org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:551)\r\n\tat org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)\r\n\tat org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)\r\n\tat org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:152)\r\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\r\n\tat org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174)\r\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\r\n\tat org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)\r\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\r\n\tat org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)\r\n\tat com.sun.proxy.$Proxy94.save(Unknown Source)\r\n\tat com.project.biddingSoft.service.DaoServiceImpl.persistEntity(DaoServiceImpl.java:36)\r\n\tat com.project.biddingSoft.controller.ServletInitializer.addNewEntity(ServletInitializer.java:77)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:564)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)\r\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:652)\r\n\tat org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:733)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)\r\n\tat org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:346)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:887)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1684)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)\r\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:832)\r\nCaused by: java.lang.IllegalArgumentException: Unknown entity: com.project.biddingSoft.domain.Storable\r\n\tat org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:723)\r\n\tat org.hibernate.internal.SessionImpl.persist(SessionImpl.java:706)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:564)\r\n\tat org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:362)\r\n\tat com.sun.proxy.$Proxy91.persist(Unknown Source)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:564)\r\n\tat org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:311)\r\n\tat com.sun.proxy.$Proxy91.persist(Unknown Source)\r\n\tat org.springframework.data.jpa.repository.support.SimpleJpaRepository.save(SimpleJpaRepository.java:557)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:564)\r\n\tat org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:289)\r\n\tat org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137)\r\n\tat org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121)\r\n\tat org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:524)\r\n\tat org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285)\r\n\tat org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:531)\r\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\r\n\tat org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:156)\r\n\tat org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:131)\r\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\r\n\tat org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)\r\n\tat org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)\r\n\tat org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)\r\n\tat org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)\r\n\tat org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)\r\n\t... 59 more\r\n",
    "message": "Unknown entity: com.project.biddingSoft.domain.Storable; nested exception is java.lang.IllegalArgumentException: Unknown entity: com.project.biddingSoft.domain.Storable",
    "path": "/addent"

在不改变 CrudeRepository 的参数化方式的情况下,我怎样才能允许子类的所有属性被持久化?也就是说,让程序忽略 Storable 超类并立即查看它下面的内容?

【问题讨论】:

    标签: java spring-boot jpa spring-data


    【解决方案1】:

    您不能将接口与CrudRepository 一起使用,因为接口本身并不能保证每个实现都将是@Entity(托管类型)。您必须改用 @Entity 的特定实现 - CrudRepository&lt;Lot, Long&gt;

    【讨论】:

    • 但是我怎样才能让我的 ServletInitializer 和 DaoServiceImpl 只需要担心一种类型的对象通过 http/ResponseEntity 并返回,而不是加载不同的实体,每个实体都有自己的表数据库?这最好由所有实体扩展的超类来完成,或者甚至可以使用抽象类?
    • 我查看了数据休息。我可以看到它是如何节省大量样板代码的,但我看不出它会如何解决这个特殊问题?
    【解决方案2】:

    通过将 CRUD 操作委托给实体对象本身,我解决了一半的问题:

    我有我的 LotRepo:

    @Repository 
    public interface ILotRepo extends  CrudRepository<Lot, Long> {
    }
    

    然后我就有了 IStorable 接口:

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", defaultImpl = Lot.class)
    @JsonSubTypes({ @JsonSubTypes.Type(value = User.class, name = "user"),
            @JsonSubTypes.Type(value = Bid.class, name = "bid") })
    public interface IStorable {
    
        public Long getId();
    
        public void setId(Long id);
    
        public boolean saveToRepo();
    
        public Iterable<? extends IStorable> findAll();
    
        public Optional<? extends IStorable> findById(Long id);
    
        public void deleteById(Long id);
    }
    

    然后我有我的实体类:

    @Entity
    @Component
    public class Lot implements IStorable {
    
        public Lot() {
            }
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
    setters, getters etc.
    
        @Transient
        @Autowired
        private static ILotRepo iLotRepo;
    
       @Autowired
        public void setILotRepo(ILotRepo ilotrepo) {
         iLotRepo = ilotrepo;
       }
    
        @Override
        public Optional<? extends IStorable> findById(Long id) throws IllegalArgumentException {
            Optional<Lot> lot = null;
            try {
                lot = iLotRepo.findById(id);
            } catch (IllegalArgumentException e) {
                throw e;
            }
            return lot;
        }
      
    other CRUD operators' implementations...
    
    }
    

    还有我的控制器:

    @RestController
            public class ServletInitializer extends SpringBootServletInitializer {
            
                @Autowired
                private DaoServiceImpl daoServiceImpl;
           
        
         
        @GetMapping(path = "/getent/{id}")
    public ResponseEntity<? extends IStorable> getEntity(@PathVariable Long id, @RequestBody IStorable entity) {
        Optional<? extends IStorable> results = daoServiceImpl.getEntityById(id, entity);
        if (results.isPresent())
            return ResponseEntity.ok(results.get());
        else
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }
        
                @PostMapping(path = "/addent")
                ResponseEntity<Object> addNewEntity(@RequestBody IStorable entity) {
                    try {
            
                        daoServiceImpl.persistEntity(entity);
                    } catch (IllegalArgumentException e) {
                        throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, e.getMessage());
                    }
                    return new ResponseEntity("Object updated successfully", HttpStatus.CREATED);
            
                }
            
            Mappings for other CRUD requests
            }
    

    最后是我的道服务:

        @Service
        @Component
        public class DaoServiceImpl {
    
        public Optional<? extends IStorable> getEntityById(Long id, IStorable entity) {
            return entity.findById(id);
        }
        
        public boolean persistEntity(IStorable entity) throws IllegalArgumentException {
        
                try {
                    entity.saveToRepo();
                } catch (IllegalArgumentException e) {
                    logger.info("Error is ", e);
                    throw e;
                }
                return true;
        
            }
        
        Services for the other CRUD requests...
        }
    

    所以现在,我可以让任何对象进入(例如 {"type": "user"})和一个控制器和一个服务来处理它们,而无需知道我们正在处理哪个 IStorable 实现。另一方面,我们将处理存储以及如何处理的责任委托给对象本身。

    所以现在我可以有另一个这样的回购:

    @Repository
    public interface IUserRepo extends  CrudRepository<User, Long> {
    
    }
    

    并将其交给同样实现 IStorable 的 User 类。

    【讨论】:

      【解决方案3】:

      尝试改变这个: CrudRepository

      为此:

      CrudRepository

      【讨论】:

      • 一开始就是这样,但这就是我改变的重点。我可能有另一个也实现 IStorable 的实体类。我不想为每个实体对象(通过 http 请求)分别实现我的 DaoServiceImpl 类中的方法,也不想为每个实体对象一个单独的 repo,就典型的基本 CRUD 操作而言担心吗?
      猜你喜欢
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-07
      • 2016-03-15
      相关资源
      最近更新 更多