Весняне завантаження - не керований тип


137

Я використовую Spring boot + JPA і під час запуску послуги виникли проблеми.

Caused by: java.lang.IllegalArgumentException: Not an managed type: class com.nervytech.dialer.domain.PhoneSettings
    at org.hibernate.jpa.internal.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:219)
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:68)
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:65)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:145)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:89)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:69)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:177)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.initAndReturn(RepositoryFactoryBeanSupport.java:239)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:225)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:92)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562)

Ось файл Application.java,

@Configuration
@ComponentScan
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
@SpringBootApplication
public class DialerApplication {

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

Я використовую UCp для об'єднання з'єднань, і конфігурація DataSource наведена нижче,

@Configuration
@ComponentScan
@EnableTransactionManagement
@EnableAutoConfiguration
@EnableJpaRepositories(entityManagerFactoryRef = "dialerEntityManagerFactory", transactionManagerRef = "dialerTransactionManager", basePackages = { "com.nervy.dialer.spring.jpa.repository" })
public class ApplicationDataSource {

    /** The Constant LOGGER. */
    private static final Logger LOGGER = LoggerFactory
            .getLogger(ApplicationDataSource.class);

    /** The Constant TEST_SQL. */
    private static final String TEST_SQL = "select 1 from dual";

    /** The pooled data source. */
    private PoolDataSource pooledDataSource;

UserDetailsУпровадження служби,

@Service("userDetailsService")
@SessionAttributes("user")
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserService userService;

Реалізація рівня обслуговування,

@Service
public class PhoneSettingsServiceImpl implements PhoneSettingsService {

}

Клас сховища,

@Repository
public interface PhoneSettingsRepository extends JpaRepository<PhoneSettings, Long> {

}

Предметний клас,

@Entity
@Table(name = "phone_settings", catalog = "dialer")
public class PhoneSettings implements java.io.Serializable {

Клас WebSecurityConfig,

@Configuration
@EnableWebMvcSecurity
@ComponentScan
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsServiceImpl userDetailsService;

    /**
     * Instantiates a new web security config.
     */
    public WebSecurityConfig() {

        super();
    }

    /**
     * {@inheritDoc}
     * @see org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter#configure(org.springframework.security.config.annotation.web.builders.HttpSecurity)
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
            .antMatchers("/login", "/logoffUser", "/sessionExpired", "/error", "/unauth", "/redirect", "*support*").permitAll()
            .anyRequest().authenticated().and().rememberMe().and().httpBasic()
            .and()
            .csrf()
            .disable().logout().deleteCookies("JSESSIONID").logoutSuccessUrl("/logoff").invalidateHttpSession(true);
    }


    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {

      auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }

}

Пакети такі,

  1. Application клас у - com.nervy.dialer
  2. Datasource клас у - com.nervy.dialer.common
  3. Курси навчальних закладів - com.nervy.dialer.domain
  4. Класи обслуговування - com.nervy.dialer.domain.service.impl
  5. Контролери в - com.nervy.dialer.spring.controller
  6. Класи сховища перебувають у - com.nervy.dialer.spring.jpa.repository
  7. WebSecurityConfig є в - com.nervy.dialer.spring.security

Дякую


1
Я вважаю, що вам все одно доведеться сказати Hibernate сканувати пакет для вашого об'єкта.
chrylis -обережнооптимістично-

Відповіді:


51

Я думаю, що заміна @ComponentScanна @ComponentScan("com.nervy.dialer.domain")буде спрацьовувати.

Редагувати:

Я додав зразок програми, щоб продемонструвати, як налаштувати об'єднане джерело даних з BoneCP.

Додаток має однакову структуру з вашою. Сподіваюся, це допоможе вам вирішити свої проблеми з налаштуваннями


Якщо я додаю @ComponentScan ("com.nervy.dialer.domain"), я отримую джерело даних, яке не любить виняток, оскільки його розміщено в іншому пакеті. Додано цей пакет також як @ComponentScan ({"com.nervy.dialer.domain", "com.nervy.dialer.common"}). Тепер отримуємо ту саму стару помилку.
користувач1578872

1
Я додав зразок програми, щоб продемонструвати, як налаштувати об'єднане джерело даних з BoneCP. github.com/azizunsal/SpringBootBoneCPPooledDataSource Програма має однакову структуру з вашою. Сподіваюся, це допоможе вам вирішити свої проблеми з налаштуваннями.
azizunsal

Ви зробили магію. Це чудово працює. Спасибі за вашу допомогу. Я мав таку примітку до джерела даних. @EnableJpaRepositories (entitManagerFactoryRef = "dialerEntityManagerFactory" ,actionManagerRef = "dialerTransactionManager", basePackages = {"com.nervytech.dialer.repository"}). Після видалення цього і просто додавання @EnableJpsRespository в DialerApplication, він почав працювати нормально.
користувач1578872

У мене така ж проблема. Весняне завантаження не розпізнає мою сутність (@DynamicUpdate від сплячої версії 4+). Я намагався додавати свій пакет моделей у ComponentScan або EntityScan, і я отримує таку ж помилку. Мої анотації до класу додатків: SpringBootApplication ComponentScan (basePackages = {"com.example.controllers", "com.example.services", "com.example.models"}) EnableAutoConfiguration @Configuration @EnableJpaRepositories (basePackages = {"comp. example.dao "," com.example.models "})
Balflear

Той самий сценарій, який ми використовували в сплячку як постачальник JPA. Як і після спробу всіх цих рішень, проблема все ще існує. Додана ця конфігурація у мій файл конфігурації програми вирішила проблему для мене. hibernate.annotation.packages.to.scan = $ {myEntityPackage}
Робін

112

Налаштуйте розташування об'єктів за допомогою @EntityScan у класі точки входу Spring Boot.

Оновлення на вересень 2016 року : Для Spring Boot 1.4+:
використовуйте org.springframework.boot.autoconfigure.domain.EntityScan
замість org.springframework.boot.orm.jpa.EntityScan, як ... boot.orm.jpa.EntityScan застарілий станом на Spring Boot 1.4


2
Цей варіант також не допомагає. Я здогадуюсь, я пропускаю щось інше в моїй конфігурації.
користувач1578872

3
Не допомагає і в моєму випадку.
Балфлер

1
Це працювало для мене, але це застаріла примітка.
Хуан Карлос Пуерто

Дякую Хуану, я оновив відповідь за допомогою поточної версії Entity Scan.
Manish Maheshwari

78

Спробуйте додати все наступне: У моїй програмі він відмінно працює з tomcat

 @EnableJpaRepositories("my.package.base.*")
 @ComponentScan(basePackages = { "my.package.base.*" })
 @EntityScan("my.package.base.*")   

Я використовую весняний завантажувач, і коли я використовую вбудований tomcat, він добре працював, @EntityScan("my.package.base.*")але коли я намагався розгорнути додаток на зовнішній tomcat, у мене з’явилася not a managed typeпомилка для моєї сутності.


Ви - мій герой.
Артур Лисик

27

У моєму випадку проблема була через те, що я забув зазначити свої анотації до моїх курсів Entity @javax.persistence.Entity. До!

//The class reported as "not a amanaged type"
@javax.persistence.Entity
public class MyEntityClass extends my.base.EntityClass {
    ....
}

У моєму випадку мені також потрібна назва таблиці в @Entityанотації. Я створив зразок проекту тут: github.com/mate0021/two_datasources.git
mate00

22

Якщо ви скопіювали консистентність стійкості з іншого проекту, ви повинні встановити пакет в EntityManagerFactory вручну:

@Bean
public EntityManagerFactory entityManagerFactory() throws PropertyVetoException {
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setGenerateDdl(true);
    LocalContainerEntityManagerFactoryBean factory;
    factory = new LocalContainerEntityManagerFactoryBean();
    factory.setPackagesToScan("!!!!!!misspelled.package.path.to.entities!!!!!");
    //...
}

18

Ви можете використовувати анотацію @EntityScan і надати пакет вашої сутності для сканування всіх ваших jpa-сутностей. Ви можете використовувати цю примітку в базовому класі додатків, де ви використовували анотацію @SpringBootApplication.

наприклад, @EntityScan ("com.test.springboot.demo.entity")



12

Я отримав цю помилку, тому що я тупо написав

публічний інтерфейс FooBarRepository розширює CrudRepository <FooBar Repository , Long> {...

Коротке пояснення: типово створюється клас FooBarRepository для управління об'єктами FooBar (часто представляючи дані в таблиці, яка називається чимось на зразок foo_bar.) Під час розширення CrudRepository для створення спеціалізованого класу репозиторію потрібно вказати тип, яким керується - у цей випадок, FooBar. Що я помилково набрав, це FooBarRepository, а не FooBar. FooBarRepository - це не той тип (клас), яким я намагаюся керувати з FooBarRepository. Тому компілятор видає цю помилку.

Я підкреслив помилковий шрифт введення жирним шрифтом . Видаліть виділене сховище слів у моєму прикладі та компілюється код.


6
15 хвилин мого життя, які я не зможу відновити
Оскар Монкайо

@TayabHussain, я оновив пост з деякими поясненнями. Сподіваюсь, це допоможе вам вийти.
Марво

7

Помістіть це у свій Application.javaфайл

@ComponentScan(basePackages={"com.nervy.dialer"})
@EntityScan(basePackages="domain")

Це дублікат для вищевказаної відповіді.
Кешу Р.

6

Ви або пропустили @Entity у визначенні класу, або у вас є явний шлях сканування компонентів, і цей шлях не містить вашого класу


3

Я використовую весняний завантажувач 2.0, і я виправив це, замінивши @ComponentScan на @EntityScan


1

У мене була ця сама проблема, але лише під час запуску тестів весняного завантаження, які вимагали JPA. Кінцевим результатом було те, що наша тестова конфігурація jpa ініціалізувала EntityManagerFactory та встановлювала пакети для сканування. Це, очевидно, буде змінювати параметри EntityScan, якщо ви встановлюєте його вручну.

    final LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter( vendorAdapter );
    factory.setPackagesToScan( Project.class.getPackage().getName());
    factory.setDataSource( dataSource );

Важливо зауважити: якщо ви все ще застрягли, вам слід встановити точку перерви в методі " org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManageron" setPackagesToScan()і подивитися, де це викликається і які пакунки передаються йому.


1

У мене виникла проблема під час переходу з Spring boot 1.3.x на 1.5, я працював після оновлення пакета сутності на bean EntityManagerFactory

  @Bean(name="entityManagerFactoryDef")
  @Primary
  public LocalContainerEntityManagerFactoryBean defaultEntityManager() {
      Map map = new HashMap();
      map.put("hibernate.default_schema", env.getProperty("spring.datasource.username"));
      map.put("hibernate.hbm2ddl.auto", env.getProperty("spring.jpa.hibernate.ddl-auto"));
      LocalContainerEntityManagerFactoryBean em = createEntityManagerFactoryBuilder(jpaVendorProperties())
              .dataSource(primaryDataSource()).persistenceUnit("default").properties(map).build();
      em.setPackagesToScan("com.simple.entity");
      em.afterPropertiesSet();
      return em;
  }

Цей квасоля посилається на клас застосування, як показано нижче

@SpringBootApplication
@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryDef")
public class SimpleApp {

}

0

У мене така ж проблема, у версії Spring boot v1.3.x, що я зробив, є оновлення весняного завантаження до версії 1.5.7.RELEASE. Тоді проблема пішла.


Я був на 1.3.x, тоді я перейшов на 1.5.6 і отримав проблему
apkisbossin


0

Нижче працював для мене ..

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

import org.apache.catalina.security.SecurityConfig;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.something.configuration.SomethingConfig;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = { SomethingConfig.class, SecurityConfig.class }) //All your configuration classes
@EnableAutoConfiguration
@WebAppConfiguration // for MVC configuration
@EnableJpaRepositories("com.something.persistence.dataaccess")  //JPA repositories
@EntityScan("com.something.domain.entity.*")  //JPA entities
@ComponentScan("com.something.persistence.fixture") //any component classes you have
public class SomethingApplicationTest {

@Autowired
private WebApplicationContext ctx;
private MockMvc mockMvc;

@Before
public void setUp() {
    this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
}

@Test
public void loginTest() throws Exception {
    this.mockMvc.perform(get("/something/login")).andDo(print()).andExpect(status().isOk());
}

}


0

Я перемістив клас заявки на батьківський пакет, наприклад:

Основний клас: com.job.application

Суб'єкт: com.job.application.entity

Таким чином не потрібно додавати @EntityScan

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.