自动装配失败:不是托管类型

Posted

技术标签:

【中文标题】自动装配失败:不是托管类型【英文标题】:Autowiring fails: Not an managed Type 【发布时间】:2012-12-13 17:09:58 【问题描述】:

我的文凭项目有一个大问题,如果你们能帮助我,我会非常高兴! 我做了一个 Maven 多模块项目并有 3 个“核心项目”

NaviClean:(家长) NaviCleanDomain:包含域模型以及我的所有实体和 NaviCleanServer 需要的接口 MeinRemoteDienstNaviCleanCleintHessianprotocol NaviCleanClient: 包含 GUI 和 Hessian 连接 NaviCleanServer NaviCleanServer:这是我的存储库,我与数据库的连接 以及接口einRemoteDienst的实现 NaviCleanServer & NaviCleanClient 在 Maven 中有 NaviCleanDomain 作为 依赖关系。

现在每次我尝试在我的 Tomcat 上启动服务器时都会收到以下错误:

ERROR: org.springframework.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'transaktionsRepository': 
Injection of persistence dependencies failed; 
nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: 
Error loading class [at.naviclean.service.impl.MeinRemoteDienstImpl] for bean with name 'meinRemoteDienstImpl' defined in file [C:\Users\Fredy\Documents\workspace-sts-3.1.0.RELEASE\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\NaviCleanServer\WEB-INF\classes\at\naviclean\service\impl\MeinRemoteDienstImpl.class]: 
problem with class file or dependent class; 
nested exception is java.lang.NoClassDefFoundError: at/naviclean/service/MeinRemoteDienst
at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:342)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
    ……………….

模型库:

package at.naviclean.domain;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;

@SuppressWarnings("serial")
@MappedSuperclass
public class ModelBase implements Serializable 

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Version
    @Column(name = "ts")
    private Date timestamp;

    public Long getId() 
        return id;
    

    public Date getTimestamp() 
        return timestamp;
    

    public void setId(Long id) 
        this.id = id;
    

    public void setTimestamp(Date timestamp) 
        this.timestamp = timestamp;
    


卡萨:

package at.naviclean.domain;

import javax.persistence.Column;
import javax.persistence.Entity;

@SuppressWarnings("serial")
@Entity
public class Kassa extends ModelBase 

    @Column(name = "name", unique = true)
    private String name;

    @Column(name = "geld")
    private int geld;

    public Kassa(String name, int geld) 
        this.name = name;
        this.geld = geld;
    

    public Kassa() 
    

    public String getName() 
        return name;
    

    public int getGeld() 
        return geld;
    

    public void setName(String name) 
        this.name = name;
    

    public void setGeld(int geld) 
        this.geld = geld;
    


MeinRemoteDienst:

package at.naviclean.service;

import at.naviclean.domain.Kassa;

public interface MeinRemoteDienst 

    int getKassaCount(int plus);

    String getNameFromKassa(int id);

    Kassa findById(int id);

BaseRepository

package at.naviclean.repositories;

import org.springframework.data.jpa.repository.JpaRepository;

import at.naviclean.domain.ModelBase;

public interface BaseRepository<T extends ModelBase> extends
        JpaRepository<T, Long> 
    T findById(long id);


KassaRepository:

package at.naviclean.repositories;

import java.util.List;

import org.springframework.data.jpa.repository.Query;

import at.naviclean.domain.Kassa;

public interface KassaRepository extends BaseRepository<Kassa> 
    List<Kassa> findByGeld(int geld);

    Kassa findByName(String name);

    @Query("select k from Kassa k where k.geld = ?1")
    Kassa findByGeld1(int geld);

MeinRemoteDienstImpl:

package at.naviclean.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import at.naviclean.domain.Kassa;
import at.naviclean.repositories.KassaRepository;
import at.naviclean.service.MeinRemoteDienst;

@Service
public class MeinRemoteDienstImpl implements MeinRemoteDienst 

    @Autowired(required = true)
    public KassaRepository kassaR;

    public int getKassaCount(int plus) 
        return 2;
    


    public String getNameFromKassa(int id) 
        return kassaR.findById(id + 0l).getName();
    

    @Override
    public Kassa findById(int id) 
        return = kassaR.findById(id + 0l);
    


application-context.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:repository="http://www.springframework.org/schema/data/repository"
    xsi:schemaLocation="http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


    <import resource="infrastructures.xml" />

    <jpa:repositories base-package="at.naviclean.repositories">
        <repository:exclude-filter type="regex"
            expression="at.naviclean.repositories.BaseRepository" />
    </jpa:repositories>

    <context:component-scan base-package="at.naviclean.service.impl" />

</beans>

infrastructures.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:jdbc="http://www.springframework.org/schema/jdbc"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">



        <bean id="entityManagerFactory"
                class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
                <property name="dataSource" ref="dataSource" />
                <property name="jpaVendorAdapter">
                        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                                <property name="showSql" value="true" />
                                <property name="generateDdl" value="true" />
                                <property name="databasePlatform" value="org.hibernate.dialect.mysqlDialect" />
                        </bean>
                </property>
        </bean>

        <bean id="dataSource"
                class="org.springframework.jdbc.datasource.DriverManagerDataSource">
                <property name="driverClassName" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost/kassatest" />
                <property name="username" value="root" />
                <property name="password" value="" />
        </bean>

        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
                <property name="entityManagerFactory" ref="entityManagerFactory" />
        </bean>


        <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

</beans>

servlet-context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:c="http://www.springframework.org/schema/c"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">



<import resource="../root-context.xml" />
    <bean id="idMeinRemoteDienst" class="at.naviclean.service.impl.MeinRemoteDienstImpl" />
    <bean name="/MeinRemoteDienstHessian"
        class="org.springframework.remoting.caucho.HessianServiceExporter"
        p:serviceInterface="at.naviclean.service.MeinRemoteDienst"
        p:service-ref="idMeinRemoteDienst" />

</beans>

root-context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <import resource="classpath:META-INF/spring/application-context.xml" />

</beans>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <!-- The definition of the Root Spring Container shared by all Servlets 
        and Filters -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
    </context-param>

    <!-- Creates the Spring Container shared by all Servlets and Filters -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>


    <servlet>
        <servlet-name>/MeinRemoteDienstHessian</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>/MeinRemoteDienstHessian</servlet-name>
        <url-pattern>/remoting/*</url-pattern>
    </servlet-mapping>

</web-app>

这是我已经尝试过的: 1. 我写了这个“变红”的测试:

package at.spengergasse.kassa;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import at.naviclean.domain.Kassa;
import at.naviclean.repositories.KassaRepository;

@ContextConfiguration("classpath:META-INF/spring/application-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class KassaTest 

    @Autowired(required = true)
    private KassaRepository kassaR;

    @Before
    public void setUp() throws Exception 

    

    @Test
    public void findByIdTest() 
        Kassa k = kassaR.findById(2);

        assertThat(k, is(not(nullValue())));
    

    @Test
    public void findByGeld() 
        Kassa k = kassaR.findByGeld1(1200);

        assertThat(k, is(not(nullValue())));
    

    @Test
    public void test() 
        Kassa vorher = new Kassa("ssf", 222);
        kassaR.save(vorher);
        Kassa nachher = kassaR.findById(vorher.getId());
        kassaR.delete(nachher);
        assertThat(vorher.getId(), is(equalTo(nachher.getId())));
    


错误:

ERROR: org.springframework.test.context.TestContextManager - 
Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@41e22632] to prepare test instance [at.spengergasse.kassa.KassaTest@6639be68]
java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:157)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
    at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:290)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
    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:174)
    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)


Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'meinRemoteDienstImpl': 
**Injection of autowired dependencies failed**; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: public at.naviclean.repositories.KassaRepository at.naviclean.service.impl.MeinRemoteDienstImpl.kassaR; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'kassaRepository': FactoryBean threw exception on object creation; 
nested exception is java.lang.IllegalArgumentException: **Not an managed type: class at.naviclean.domain.Kassa**
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
    ………..

2.我在我的 persitence.xml 我的 domainmodel 中手动插入了一个存储库。结果是“绿色”测试,但我仍然无法启动服务器...

提前非常感谢!!!我无法想象没有你会怎样:)

【问题讨论】:

把整个代码库放在这里!你能做一些基本的调试吗?尝试使用 -X-e 开关运行 Maven,以获取调试日志以及完整的堆栈跟踪。 我已经这样做了:问题是我无法自动装配我的存储库,因为我的域类不是托管类型 【参考方案1】:

Oliver Gierke 给了我一个非常有用的建议:

您得到的最后一个异常实际上表明您的 JPA 存在问题 设置。 “不是托管 bean”意味着不是 JPA 提供者知道的类型 的。如果您正在设置基于 Spring 的 JPA 应用程序,我建议您 配置“packagesToScan”属性 LocalContainerEntityManagerFactory 你已经配置到包 包含您的 JPA 实体。或者,您可以列出所有您的 persistence.xml 中的实体类,但这通常比较麻烦。

你得到的前一个错误(NoClassDefFound)表示类 提到在项目类路径中不可用。所以你可能 想检查您拥有的模块间依赖关系。作为两人 相关类似乎位于同一个模块中,它也可能 只是对Tomcat的不完整部署的问题(WTP很友好 有时很讨厌)。我肯定会建议运行测试 验证(就像你已经做过的那样)。因为这似乎会引导你 不同的例外,我想这确实是一些 Eclipse 故障

谢谢!

【讨论】:

对于任何使用 Spring Boot 的人,都可以使用 @EntityScan 注解。请参阅相关问题的答案:***.com/a/25368455/854151 是在对象 LocalContainerEntityManagerFactoryBean 上使用 setPackagesToScan 方法 这帮助我发现一位同事拼错了我们的实体包,导致“不是托管 bean”:'在您已配置到包含 JPA 的包的 LocalContainerEntityManagerFactory 上配置“packagesToScan”属性实体的 是的,这个解决方案对我有用。谢谢@alfred_m。确保设置 LocalContainerEntityManagerFactoryBean::setPackagesToScan()。就我而言,我做了一个错字,从控制器到 dao 的整个依赖链都失败了。确保正确验证完全限定的包名称。【参考方案2】:

您应该扩展组件扫描的范围,例如&lt;context:component-scan base-package="at.naviclean" /&gt; 因为您将实体放在包中 at.naviclean.domain;

这应该可以帮助您摆脱异常: 不是托管类型:class at.naviclean.domain.Kassa

为了进一步调试,您可以尝试转储应用程序上下文(请参阅 javadoc)以探索组件扫描检测到哪些类,如果仍然无法识别某些类,请检查它们的注释(@Service、@Component 等)

编辑:

您还需要将类添加到您的persistence.xml

<persistence-unit>
    <class>at.naviclean.domain.Kassa</class>
     ...
</persistence-unit>

【讨论】:

感谢您的建议...好吧,我扩展了组件扫描,但我仍然得到相同的例外:(如果我提到,我不明白为什么 testclass 能够管理“Kassa”它在我的 persistence.xml 就是这样。正确获取所需 EntityManager 的 EntityManagerConfiguration,正确设置 PersistenceUnit 和 PackagesToScan,不要忘记更新 application-context.xml 以让组件扫描到达实体。【参考方案3】:

如果有人遇到同样的问题,我通过在我的主类中添加 @EntityScan 来解决它。只需将模型包添加到 basePackages 属性即可。

【讨论】:

我是春天的新手。我不知道这是如何工作的,但它解决了我的问题,谢谢,如果可能的话,解释一下 @EntityScan 是一种直接告诉 Spring 的方式“嘿,所以,我有这个你没有找到的实体(可能是因为这些实体属于另一个项目/依赖项),请看这里”跨度> 【参考方案4】:

在 Spring Boot 中,我使用 CrudRepository 得到了同样的异常,因为我忘记设置泛型类型。我想把它写在这里以防它对某人有帮助。

错误定义:

public interface OctopusPropertiesRepository extends CrudRepository

错误:

Caused by: java.lang.IllegalArgumentException: Not a managed type: class java.lang.Object

成功定义:

public interface OctopusPropertiesRepository extends CrudRepository<OctopusProperties,Long>

【讨论】:

花了我一些时间,当我找到这个答案时,我意识到我忽略了所需的打字,谢谢。 这也是我的错误。遗憾的是,这个答案在列表中太低了,我没注意到。【参考方案5】:

对于控制器,@SpringBootApplication(scanBasePackages = "com.school.controllers")

对于存储库,@EnableJpaRepositories(basePackages = "com.school.repos")

对于实体,@EntityScan(basePackages = "com.school.models")

这样就可以了

“无法自动装配@Repository 注释接口”

问题和

不是托管类型

问题。下面的示例配置

package com.school.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;


@SpringBootApplication(scanBasePackages = "com.school.controllers")
@EnableJpaRepositories(basePackages = "com.school.repos")
@EntityScan(basePackages = "com.school.models")
public class SchoolApplication 

    public static void main(String[] args) 
        SpringApplication.run(SchoolApplication.class, args);
    


【讨论】:

【参考方案6】:

就我而言,在使用 IntelliJ 时,我的项目中有多个模块。主模块依赖于另一个对 Spring 具有 Maven 依赖关系的模块。

主模块有Entitys,第二个模块也有。但是当我运行主模块时,只有第二个模块中的Entitys 被识别为托管类。

然后我也在主模块上添加了 Spring 依赖项,你猜怎么着?它识别了所有Entitys。

【讨论】:

我有同样的问题,我有多个模块,第一个模块中的实体类无法识别,但第二个模块中的实体类被识别。你介意解释一下你到底做了什么来让它工作吗?我使用的是弹簧启动,所以没有任何弹簧依赖配置文件。我根据spring boot的需要在主应用程序类中添加了ComponentScan。感谢您的时间和帮助。 您好 Alice,这可能不是正确的方法,但请确保您在两个模块中都依赖于 spring-boot。您使用的是哪个构建系统?马文?摇篮? 我不使用弹簧靴,但我面临着类似的问题。该应用程序在部署在服务器上时工作正常,但在运行测试用例时会出现此“非托管类型”错误。【参考方案7】:

在遇到此问题并尝试将实体包名称名称添加到 EntityScan、ComponentScan 等的不同方法后,均无效。

将包添加到存储库配置的 EntityManagerFactory 中的 packageScan 配置。下面的代码给出了基于代码的配置,而不是上面回答的基于 XML 的配置。

@Primary
@Bean(name = "entityManagerFactory")
public EntityManagerFactory entityManagerFactory() 
    LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
    emf.setDataSource(dataSource);
    emf.setJpaVendorAdapter(jpaVendorAdapter);
    emf.setPackagesToScan("org.package.entity");
    emf.setPersistenceUnitName("default"); 
    emf.afterPropertiesSet();
    return emf.getObject();

【讨论】:

【参考方案8】:

你需要检查 packagesToScan。

<bean id="entityManagerFactoryDB" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    <property name="dataSource" ref="dataSourceDB" />
    <property name="persistenceUnitName" value="persistenceUnitDB" />
    <property name="packagesToScan" value="at.naviclean.domain" />
                                            //here
 .....

【讨论】:

【参考方案9】:

当您间接扩展 JpaRepository(KassaRepository 扩展了扩展 JpaRepository 的 BaseRepository)时,您必须使用 @NoRepositoryBean 注释 BaseRepository:

@NoRepositoryBean
public interface BaseRepository<T extends ModelBase> extends JpaRepository<T, Long> 
    T findById(long id);

【讨论】:

谢谢!这是我的实际问题!【参考方案10】:

以防万一其他一些糟糕的草皮因为遇到与我相同的问题而出现在这里:如果您有多个数据源并且这种情况发生在 非主要数据源中,那么问题可能与该配置有关。数据源、实体管理器工厂和事务工厂都需要正确配置,而且——这就是让我感到困惑的地方——确保将它们全部捆绑在一起! @EnableJpaRepositories(配置类注解)必须包含entityManagerFactoryReftransactionManagerRef才能获取所有配置!

in this blog 的例子终于帮助我看到了我缺少的东西,(为了快速参考)是这里的参考:

@EnableJpaRepositories(
    entityManagerFactoryRef = "barEntityManagerFactory",
    transactionManagerRef = "barTransactionManager",
    basePackages = "com.foobar.bar")

希望这有助于将其他人从我所忍受的斗争中解救出来!

【讨论】:

【参考方案11】:

参考 Oliver Gierke 的提示:

当persistance.xml 的操作成功时,您创建了一个普通的java 类而不是实体类。

当创建一个新的实体类时,persistance.xml 中的条目应该由 Netbeans 设置(在我的例子中)。

但正如 Oliver Gierke 所说,您可以稍后将该条目添加到persistance.xml(如果您创建了一个普通的 java 类)。

【讨论】:

【参考方案12】:

对我来说,基于@alfred_m 所说的错误非常简单.....tomcat 有 2 个 jars 冲突,具有相同的类名和配置集。

发生的事情是......我复制了我现有的项目以从现有项目中创建一个新项目。但没有进行必要的更改,我开始从事其他项目。 Henec 2项目有相同的类和配置文件,导致冲突。

删除了复制的项目,一切都开始工作了!!!

【讨论】:

【参考方案13】:

当您将不正确的 Entity 对象传递给存储库类中的 CrudRepository 时,您会得到相同的异常。

public interface XYZRepository extends CrudRepository<IncorrectEntityClass, Long>

【讨论】:

以上是关于自动装配失败:不是托管类型的主要内容,如果未能解决你的问题,请参考以下文章

注入自动装配的依赖项失败,无法自动装配字段

创建 bean 时出错。注入自动装配的依赖项失败。无法自动装配字段

spring+hibernate:自动装配依赖注入失败

在单元测试中覆盖自动装配的 Bean

使用限定符注入自动装配的依赖项失败

具有自动装配的字段但得到无法自动装配字段消息