Spring boot - Bukan tipe yang dikelola


137

Saya menggunakan Spring boot + JPA dan mengalami masalah saat memulai layanan.

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)

Ini adalah file Application.java,

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

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

Saya menggunakan UCp untuk pooling koneksi dan konfigurasi DataSource di bawah ini,

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

Implementasi UserDetailsService,

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

    @Autowired
    private UserService userService;

Implementasi lapisan layanan,

@Service
public class PhoneSettingsServiceImpl implements PhoneSettingsService {

}

Kelas repositori,

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

}

Kelas entitas,

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

WebSecurityConfig class,

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

}

Paket-paket tersebut adalah sebagai berikut,

  1. Application kelas ada di - com.nervy.dialer
  2. Datasource kelas ada di - com.nervy.dialer.common
  3. Kelas entitas ada di - com.nervy.dialer.domain
  4. Kelas layanan ada di - com.nervy.dialer.domain.service.impl
  5. Pengendali ada di - com.nervy.dialer.spring.controller
  6. Kelas-kelas repositori ada di - com.nervy.dialer.spring.jpa.repository
  7. WebSecurityConfig ada di - com.nervy.dialer.spring.security

Terima kasih


1
Saya yakin Anda masih perlu memberi tahu Hibernate untuk memindai paket untuk objek entitas Anda.
chrylis -cautiouslyoptimistic-

Jawaban:


51

Saya pikir mengganti @ComponentScandengan @ComponentScan("com.nervy.dialer.domain")akan berhasil.

Edit:

Saya telah menambahkan contoh aplikasi untuk menunjukkan cara mengatur koneksi sumber data yang dikumpulkan dengan BoneCP.

Aplikasi ini memiliki struktur yang sama dengan Anda. Saya harap ini akan membantu Anda untuk menyelesaikan masalah konfigurasi Anda


Jika saya menambahkan @ComponentScan ("com.nervy.dialer.domain"), saya mendapatkan sumber data bukan pengecualian karena ada dalam paket yang berbeda. Menambahkan paket itu juga seperti @ComponentScan ({"com.nervy.dialer.domain", "com.nervy.dialer.common"}). Sekarang dapatkan kesalahan lama yang sama.
user1578872

1
Saya telah menambahkan contoh aplikasi untuk menunjukkan cara mengatur koneksi sumber data yang dikumpulkan dengan BoneCP. github.com/azizunsal/SpringBootBoneCPPooledDataSource Aplikasi ini memiliki struktur yang sama dengan Anda. Saya harap ini akan membantu Anda untuk menyelesaikan masalah konfigurasi Anda.
azizunsal

Anda melakukan keajaiban. Ini bekerja dengan baik. Terima kasih atas bantuan Anda. Saya memiliki anotasi berikut dalam sumber data. @EnableJpaRepositories (entitasManagerFactoryRef = "dialerEntityManagerFactory", transactionManagerRef = "dialerTransactionManager", basePackages = {"com.nervytech.dialer.repository"}). Setelah menghapus ini dan hanya menambahkan @EnableJpsRespository di DialerApplication, itu mulai berfungsi dengan baik.
user1578872

Saya memiliki masalah yang sama. Spring boot tidak mengenali Entity saya (@DynamicUpdate dari versi hibernate 4+). Saya sudah mencoba menambahkan paket model saya di ComponentScan atau EntityScan dan saya mendapatkan kesalahan yang sama. Anotasi saya di kelas Aplikasi adalah: SpringBootApplication ComponentScan (basePackages = {"com.example.controllers", "com.example.services", "com.example.models"}) EnableAutoConfiguration @Configuration @EnableJpaRepositories (basePackages = {com. example.dao "," com.example.models "})
Balflear

Skenario yang sama kami menggunakan Hibernated sebagai penyedia JPA. Seperti setelah mencoba semua solusi ini masih ada masalah. Menambahkan konfigurasi ini dalam file konfigurasi aplikasi saya menyelesaikan masalah bagi saya. hibernate.annotation.packages.to.scan = $ {myEntityPackage}
Robin

112

Konfigurasikan lokasi entitas menggunakan @EntityScan di kelas titik masuk Boot Musim Semi.

Pembaruan pada September 2016 : Untuk Spring Boot 1.4+:
gunakan org.springframework.boot.autoconfigure.domain.EntityScan
alih-alih org.springframework.boot.orm.jpa.EntityScan, karena ... boot.orm.jpa.EntityScan sudah tidak digunakan lagi pada Spring Boot 1.4


2
Opsi ini juga tidak membantu. Saya kira, saya kehilangan sesuatu yang lain dalam konfigurasi saya.
user1578872

3
Tidak membantu dalam kasus saya juga.
Balflear

1
Itu memang berhasil bagi saya tetapi itu adalah anotasi yang sudah usang.
Juan Carlos Puerto

Terima kasih Juan, saya telah memperbarui jawabannya dengan versi saat ini dari Entity Scan.
Manish Maheshwari

78

Coba tambahkan Semua yang berikut, Dalam aplikasi saya berfungsi dengan baik dengan kucing jantan

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

Saya menggunakan spring boot, dan ketika saya menggunakan tomcat yang disematkan itu berfungsi dengan baik @EntityScan("my.package.base.*")tetapi ketika saya mencoba untuk menyebarkan aplikasi ke tomcat eksternal saya mendapat not a managed typekesalahan untuk entitas saya.


Kamu adalah pahlawanku.
Artur Łysik

27

Dalam kasus saya masalahnya adalah karena saya lupa untuk membuat anotasi kelas Entitas saya dengan @javax.persistence.Entityanotasi. Doh!

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

Dalam kasus saya, saya juga perlu nama tabel dalam @Entityanotasi. Saya membuat contoh proyek di sini: github.com/mate0021/two_datasources.git
mate00

22

Jika Anda telah menyalin konfigurasi persistensi dari proyek lain, Anda harus mengatur paket di EntityManagerFactory secara manual:

@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

Anda dapat menggunakan anotasi @EntityScan dan memberikan paket entitas Anda untuk memindai semua entitas jpa Anda. Anda dapat menggunakan anotasi ini di kelas aplikasi dasar di mana Anda menggunakan anotasi @SpringBootApplication.

mis. @EntityScan ("com.test.springboot.demo.entity")



12

Saya mendapatkan kesalahan ini karena saya menulis dengan bodoh

antarmuka publik FooBarRepository meluas CrudRepository <FooBar Repository , Long> {...

Penjelasan singkat: Seseorang biasanya membuat kelas FooBarRepository untuk mengelola objek FooBar (sering mewakili data dalam tabel yang disebut sesuatu seperti foo_bar.) Saat memperluas CrudRepository untuk membuat kelas repositori khusus, kita perlu menentukan jenis yang dikelola - di kasus ini, FooBar. Apa yang saya salah ketik adalah FooBarRepository daripada FooBar. FooBarRepository bukan tipe (kelas) yang saya coba kelola dengan FooBarRepository. Oleh karena itu, kompilator mengeluarkan kesalahan ini.

Saya menyoroti sedikit salah mengetik dalam huruf tebal . Hapus Repositori kata yang disorot dalam contoh saya dan kompilasi kode.


6
15 menit dalam hidup saya yang saya tidak akan dapat pulihkan
Oscar Moncayo

@TayabHussain, saya memperbarui posting dengan beberapa penjelasan. Semoga ini bisa membantu Anda.
Marvo

7

Letakkan ini di Application.javafile Anda

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

Ini adalah duplikat untuk jawaban di atas.
Keshu R.

6

Anda melewatkan @Entity pada definisi kelas atau Anda memiliki jalur pemindaian komponen eksplisit dan jalur ini tidak mengandung kelas Anda


3

Saya menggunakan spring boot 2.0 dan saya memperbaikinya dengan mengganti @ComponentScan dengan @EntityScan


1

Saya punya masalah yang sama tetapi hanya ketika menjalankan tes booting musim semi kasus yang diperlukan JPA. Hasil akhirnya adalah bahwa konfigurasi pengujian jpa kita sendiri menginisialisasi EntityManagerFactory dan mengatur paket untuk dipindai. Ini jelas akan menimpa parameter EntityScan jika Anda mengaturnya secara manual.

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

Penting untuk dicatat: jika Anda masih macet, Anda harus menetapkan titik istirahat pada org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManagerpada setPackagesToScan()metode dan lihat di mana ini dipanggil dan paket apa yang sedang diteruskan ke sana.


1

Saya punya beberapa masalah saat melakukan migrasi dari boot Spring 1.3.x ke 1.5, saya berhasil setelah memperbarui paket entitas di EntityManagerFactory bean

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

Kacang ini disebut dalam kelas Aplikasi seperti di bawah ini

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

}

0

Saya memiliki masalah yang sama, pada versi spring boot v1.3.x yang saya lakukan adalah meng-upgrade spring boot ke versi 1.5.7.RELEASE. Lalu masalahnya hilang.


Saya menggunakan 1.3.x lalu beralih ke 1.5.6 dan mendapatkan masalah
apkisbossin

0

Saya mengalami masalah ini karena saya tidak memetakan semua entitas dalam file orm.xml


0

Di bawah ini bekerja untuk saya ..

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

Saya telah memindahkan kelas aplikasi saya ke paket induk seperti:

Kelas utama: com.job.application

Entity: com.job.application.entity

Dengan cara ini Anda tidak perlu menambahkan @EntityScan

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.