web-dev-qa-db-de.com

Autowiring schlägt fehl: Kein verwalteter Typ

Ich habe ein großes Problem in meinem Diplomprojekt und würde mich sehr freuen, wenn ihr mir helfen könntet! Ich habe ein Maven-Multi-Modul-Projekt gemacht und habe 3 "Kernprojekte"

  • NaviClean: (übergeordnetes Element)
  • NaviCleanDomain: enthält das Domänenmodell mit allen meinen Entitäten undeine Schnittstelle MeinRemoteDienst, die von NaviCleanServer und NaviCleanCleint für die Hessianprotocol benötigt wird.
  • NaviCleanClient: Verbindet die GUI und eine hessische Verbindung zu NaviCleanServer
  • NaviCleanServer: Hier sind meine Repositories, meine Verbindung zur DB und die Implementierung der Schnittstelle einRemoteDienstNaviCleanServer & NaviCleanClient haben in Maven NaviCleanDomain als .__ Abhängigkeit.

Jedes Mal, wenn ich versuche, den Server auf meinem Tomcat zu starten, erhalte ich die folgende Fehlermeldung: 

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)
    ……………….

ModelBase:

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

}

Kassa:

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>

infrastrukturen.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>

Folgendes habe ich bereits ausprobiert: 1. Ich schrieb diesen Test, der "rot wurde":

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

}

FEHLER:

ERROR: org.springframework.test.context.TestContextManager - 
Caught exception while allowing TestExecutionListener [org.springframewor[email protected]41e22632] to prepare test instance [[email protected]]
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. Ich füge in meiner persitence.xml mein Domainmodell manuell ein Repository ein. Das Ergebnis war ein "grüner" Test, aber ich konnte den Server immer noch nicht starten ...

Vielen Dank im Voraus!!! Ich kann mir nicht vorstellen, was es ohne dich wäre :)

37
alfred_m

Ich bekam einen sehr hilfreichen Rat von Oliver Gierke:

Die letzte Ausnahme, die Sie erhalten, weist auf ein Problem mit Ihrer JPA .__ hin. Konfiguration. "Keine verwaltete Bean" bedeutet, dass dem JPA-Anbieter kein Typ bekannt ist von. Wenn Sie eine Spring-basierte JPA-Anwendung einrichten, empfehle ich um die Eigenschaft "packagesToScan" auf der .__ zu konfigurieren. LocalContainerEntityManagerFactory, die Sie für das Paket .__ konfiguriert haben. das enthält Ihre JPA-Entitäten. Alternativ können Sie alle Ihre .__ auflisten. Entitätsklassen in persistence.xml, aber das ist normalerweise umständlicher.

Der vorherige Fehler (NoClassDefFound) zeigt die Klasse .__ an. Erwähnt ist nicht im Klassenpfad des Projekts verfügbar. Sie könnten also Sie möchten die Abhängigkeiten zwischen den einzelnen Modulen überprüfen. Wie die beiden relevante Klassen scheinen sich in demselben Modul zu befinden, es könnte auch Seien Sie einfach ein Problem mit einer unvollständigen Bereitstellung in Tomcat (WTP ist manchmal eine Art .__ von Zicklein). Ich würde definitiv empfehlen, einen Test für .__ durchzuführen. Bestätigung (wie Sie es bereits getan haben). Da dies scheinbar zu einem .__ führt. andere Ausnahme, ich denke, es ist wirklich ein Eclipse-Fehler

Vielen Dank!

118
alfred_m

Sie sollten den Umfang des Komponentenscans erweitern, z. <context:component-scan base-package="at.naviclean" />, da Sie die Entitäten in Paket at.naviclean.domain; platziert haben.

Dies sollte Ihnen dabei helfen, die Ausnahme zu beseitigen: Kein verwalteter Typ: class at.naviclean.domain.Kassa  

Zur weiteren Fehlersuche können Sie versuchen, den Anwendungskontext zu sichern (siehe Javadoc), um herauszufinden, welche Klassen beim Komponentenscan erkannt wurden, wenn einige noch nicht erkannt wurden.

BEARBEITEN:

Sie müssen auch die Klassen zu Ihrem persistence.xml hinzufügen. 

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

Wenn jemand mit dem gleichen Problem zu kämpfen hat, habe ich es gelöst, indem ich @EntityScan in meine Hauptklasse aufgenommen habe. Fügen Sie einfach Ihr Modellpaket zur Eigenschaft basePackages hinzu.

6
Alberto Alegria

Im Frühjahr bekomme ich dieselbe Ausnahme, wenn ich CrudRepository verwende, weil ich vergessen habe, generische Typen festzulegen. Ich möchte es hier schreiben, falls es jemandem hilft.

fehlerhafte Definition:

public interface OctopusPropertiesRepository extends CrudRepository

error:

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

erfolgreiche Definition:

public interface OctopusPropertiesRepository extends CrudRepository<OctopusProperties,Long>{
4
cacert

In meinem Fall hatte ich bei der Verwendung von IntelliJ mehrere Module im Projekt. Das Hauptmodul war von einem anderen Modul abhängig, das die wichtigsten Abhängigkeiten von Spring hatte.

Das Hauptmodul hatte Entitys und das zweite Modul auch. Beim Ausführen des Hauptmoduls wurden jedoch nur die Entitys aus dem zweiten Modul als verwaltete Klassen erkannt.

Ich habe dann auch Springabhängigkeiten auf dem Hauptmodul hinzugefügt, und wissen Sie was? Es erkannte alle Entitys.

3
Ruraj

sie benötigen Check Packages ToScan.

<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
 .....
2
jonas.lima

Nachdem dieses Problem aufgetreten ist und verschiedene Methoden zum Hinzufügen des Entitätspaketnamens zu EntityScan, ComponentScan usw. verwendet wurden, funktionierte nichts.

Das Paket wurde zu packageScan config in der EntityManagerFactory der Repository-Konfiguration hinzugefügt. Der folgende Code enthält die codebasierte Konfiguration im Gegensatz zu den oben genannten XML-basierten.

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

In Bezug auf Oliver Gierkes Hinweis:

Wenn die Manipulation der persistance.xml den Trick ausführt, haben Sie eine normale Java-Klasse anstelle einer Entitätsklasse erstellt. 

Beim Erstellen einer neuen Entitätsklasse sollte der Eintrag in der persistance.xml von Netbeans (in meinem Fall) festgelegt werden.

Wie bereits von Oliver Gierke erwähnt, können Sie den Eintrag später zur persistance.xml hinzufügen (wenn Sie eine normale Java-Klasse erstellt haben).

0
walt

Wenn Sie JpaRepository indirekt erweitern (KassaRepository erweitert BaseRepository um JpaRepository), müssen Sie BaseRepository mit @NoRepositoryBean versehen:

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

Dieselbe Ausnahme tritt auf, wenn Sie das falsche Entity-Objekt an das CrudRepository in der Repository-Klasse übergeben.

public interface XYZRepository extends CrudRepository<IncorrectEntityClass, Long>
0
Vaibs

Für mich war der Fehler ziemlich einfach, basierend auf dem, was @ alfred_m sagte ..... Tomcat hatte zwei Gläser, die den gleichen Satz von Klassennamen und die gleiche Konfiguration hatten.

Was passiert ist, war .............. Ich habe mein bestehendes Projekt kopiert, um ein neues Projekt aus dem vorhandenen Projekt zu machen. Aber ohne die erforderlichen Änderungen vorzunehmen, arbeitete ich an einem anderen Projekt. Henec-2-Projekte hatten dieselben Klassen und Konfigurationsdateien, was zu Konflikten führte.

Das kopierte Projekt wurde gelöscht und die Dinge funktionierten !!!!

0
Shine