Автоподключение не выполняется: не управляемый тип

У меня большая проблема в моем дипломном проекте, и я был бы очень рад, если бы вы, ребята, могли мне помочь! Я создал проект Maven Multi Module и имею 3 «основных проекта»,

  • NaviClean: (Parent)
  • NaviCleanDomain: contains the domain model with all my entities and an interface MeinRemoteDienst which is needed by NaviCleanServer and NaviCleanCleint for the Hessianprotocol
  • NaviCleanClient: conatins the GUI and a Hessian connection to NaviCleanServer
  • NaviCleanServer: Here are my repositories, my connection to the DB and the Implementation of the interface einRemoteDienst NaviCleanServer & NaviCleanClient have NaviCleanDomain in Maven as Dependency.

Теперь каждый раз, когда я пытаюсь запустить Server на моем 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)
    ……………….

<Сильный> 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 extends
        JpaRepository {
    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 {
    List 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);
    }

}

<Сильный> приложения context.xml:

<?xml version="1.0" encoding="UTF-8" ?>



    

    
        
    

    


<Сильный> infrastructures.xml:

<?xml version="1.0" encoding="UTF-8"?>




        
                
                
                        
                                
                                
                                
                        
                
        

        
                
                
                
                
        

        
                
        


        


<Сильный> сервлет-context.xml:

<?xml version="1.0" encoding="UTF-8"?>





    
    


<Сильный> корневой context.xml:

<?xml version="1.0" encoding="UTF-8"?>


    


<Сильный> web.xml:

<?xml version="1.0" encoding="UTF-8"?>


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

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


    
        /MeinRemoteDienstHessian
        org.springframework.web.servlet.DispatcherServlet
        
            contextConfigLocation
            /WEB-INF/spring/appServlet/servlet-context.xml
        
        1
    

    
        /MeinRemoteDienstHessian
        /remoting/*
    


Here is what I already tried: 1. I wrote this test which "went red":

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

}

ERRORS:

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. I insertet in my persitence.xml my domainmodel an repositories manually. The result was a "green" test but I wasn't still able to start the server...

Заранее большое спасибо!!! Я не могу представить, что бы это было без тебя :)

33
Ввод всей кодовой базы здесь! Можете ли вы выполнить отладку на базовом уровне? Попробуйте запустить Maven с помощью -X или -e , чтобы получить журнал отладки, а также полный стек.
добавлено автор Arpit, источник
Я уже сделал это: проблема в том, что я не могу автоопределить мой репозиторий, потому что мой класс домена не управляемый тип
добавлено автор alfred_m, источник

10 ответы

I got an very helpful advice from Oliver Gierke:

Последнее исключение, которое вы получаете, фактически указывает на проблему с вашей JPA   настроить. «Не управляемый компонент» означает не тип, который знает поставщик JPA   из. Если вы создаете приложение JPA на основе Spring, я бы рекомендовал   для настройки свойства "packageToScan" на   LocalContainerEntityManagerFactory, который вы настроили для пакета   который содержит ваши объекты JPA. Кроме того, вы можете перечислить все свои   сущностей в persistence.xml, но это обычно более громоздко.

     

Первая ошибка, которую вы получили (NoClassDefFound), указывает класс   упомянутый не доступен в классах классов проектов. Таким образом, вы можете   хотите проверить зависимости между модулями. Поскольку два   соответствующие классы, по-видимому, расположены в том же модуле, что и   просто проблема с неполным развертыванием Tomcat (WTP является добрым   иногда изредка). Я определенно рекомендую запустить тест для   проверка (как вы уже сделали). Поскольку это, кажется, ведет вас к   другое исключение, я думаю, что это действительно какой-то затмение Eclipse

Благодаря!

113
добавлено
да на объекте LocalContainerEntityManagerFactoryBean используется метод setPackagesToScan
добавлено автор ozOli, источник
Это помогло мне выявить, что коллега ошибся с нашим пакетом сущностей, вызывая «Не управляемый компонент»: «настройте свойство« packageToScan »на LocalContainerEntityManagerFactory, которое вы настроили на пакет, содержащий ваши объекты JPA»
добавлено автор cellepo, источник
Для тех, кто использует Spring Boot, можно использовать аннотацию @EntityScan . См. Ответ на соответствующий вопрос: stackoverflow.com/a/25368455/854151
добавлено автор Anders Rabo Thorbeck, источник

You should extend the scope of the component-scan e.g. since you placed the entities in package at.naviclean.domain;

Это должно помочь вам избавиться от освобождения: Не управляемый тип: класс at.naviclean.domain.Kassa

Для дальнейшей отладки вы можете попытаться сбросить контекст приложения (см. Javadoc), чтобы узнать, какие классы были обнаружены с помощью проверки компонентов, если некоторые из них до сих пор не распознаны, проверяют их аннотацию (@Service, @Component и т. Д.),

РЕДАКТИРОВАТЬ:

Вам также нужно добавить классы в свой persistence.xml


    at.naviclean.domain.Kassa
     ...

9
добавлено
Это оно. Получите EntityManagerConfiguration за каждый желаемый EntityManager, установите PersistenceUnit и PackagesToScan правильно и не забудьте обновить application-context.xml, чтобы позволить компонентному сканированию достичь объектов.
добавлено автор Lemonade, источник
Спасибо за совет ... ну, я расширил компонент-сканирование, но я все равно получаю то же самое: (я не понимаю, почему testclass может управлять «Kassa», если я упоминаю об этом в моем persistence.xml
добавлено автор alfred_m, источник

Весной загрузки я получаю такое же исключение, используя CrudRepository, потому что забыл установить общие типы. Я хочу написать здесь, если это кому-то поможет.

ошибочное определение:

public interface OctopusPropertiesRepository extends CrudRepository

ошибка:

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

успешное определение:

public interface OctopusPropertiesRepository extends CrudRepository{
3
добавлено

В моем случае, при использовании IntelliJ, у меня было несколько модулей в проекте. Основной модуль зависел от другого модуля, который имел зависимостей maven от Spring.

Основной модуль имел Entity s, а также второй модуль. Но когда я запустил основной модуль, только второй код Entity от второго модуля получил признание как управляемые классы.

Затем я добавил зависимости Spring от основного модуля, и угадайте, что? Он распознал все Entity s.

3
добавлено
У меня такая же проблема, когда у меня есть несколько модулей, а классы сущностей в первых модулях не распознаются, но распознаются классы сущностей во втором модуле. Не возражаете ли вы объяснить, что именно вы сделали, чтобы заставить его работать? Я использую весеннюю загрузку, поэтому нет никакого конфигурационного файла зависимости от пружины. Я добавил ComponentScan в основной класс приложения по мере необходимости весной загрузки. Спасибо за ваше время и помощь.
добавлено автор Alice, источник
Я не использую весенний ботинок, но сталкиваюсь с подобной проблемой. Приложение отлично работает при развертывании на сервере, но при выполнении тестовых примеров появляется ошибка «Не управляемый тип».
добавлено автор Tushar Patel, источник
Привет, Алиса, это может быть не совсем правильно, но убедитесь, что у вас есть зависимости от весенней загрузки в обоих модулях. Какую систему сборки вы используете? Maven? Gradle?
добавлено автор Ruraj, источник

Если кто-то борется с той же проблемой, я решил это, добавив @EntityScan в мой основной класс. Просто добавьте свой пакет модели в свойство basePackages.

1
добавлено

вам нужно проверить пакетыToScan.


    
    
                                            //here
 .....
1
добавлено

Если вы косвенно коснитесь JpaRepository (KassaRepository расширяет BaseRepository, расширяющий JpaRepository), вам необходимо аннотировать BaseRepository с помощью @NoRepositoryBean :

@NoRepositoryBean
public interface BaseRepository extends JpaRepository {
    T findById(long id);
}
1
добавлено

Ссылаясь на намек Оливера Гирке:

Когда манипуляция с persistance.xml делает трюк, тогда вы создали обычный java-класс вместо класса сущности.

При создании нового класса сущности, запись в файле persistance.xml должна быть задана Netbeans (в моем случае).

Но, как упоминал Оливер Гирке, вы можете добавить запись позже в persistance.xml (если вы создали обычный класс java).

0
добавлено

После того, как вы столкнулись с этой проблемой и попробовали использовать другой метод добавления имени объекта пакета в EntityScan, ComponentScan и т. Д., Ни одна из них не работала.

Добавлен пакет в конфигурацию packageScan в EntityManagerFactory конфигурации репозитория. В приведенном ниже коде представлена ​​конфигурация на основе кода, а не на основе 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();
}
0
добавлено

Для меня ошибка была довольно простой, основанной на том, что сказал @alfred_m ..... у tomcat было 2 бара, конфликтующих с тем же набором имен и конфигурации классов.

То, что произошло, было .............. Я скопировал свой существующий проект, чтобы сделать новый проект из существующего проекта. но без внесения необходимых изменений я начал работать над другим проектом. Проекты Henec 2 имели одинаковые классы и файлы конфигурации, что приводило к конфликту.

Удалил скопированный проект, и все начало работать !!!!

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Spring Framework and more
Spring Framework and more
839 участник(ов)

чат о spring framework и связанных с ним технологиях. We're discussing: job, tech questions, beer meet up/networking: tech review ,LinkedIn skills, SOF q/a raise up& etc. languages: russian,java,eng.

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async