Spring boot - Yönetilen bir tür değil


137

Spring boot + JPA kullanıyorum ve servisi başlatırken sorun yaşıyorum.

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)

İşte Application.java dosyası,

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

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

Bağlantı havuzu oluşturmak için UCp kullanıyorum ve DataSource yapılandırması aşağıda,

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

UserDetailsService Uygulaması,

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

    @Autowired
    private UserService userService;

Servis katmanı uygulaması,

@Service
public class PhoneSettingsServiceImpl implements PhoneSettingsService {

}

Depo sınıfı,

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

}

Varlık sınıfı,

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

WebSecurityConfig sınıfı,

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

}

Paketler aşağıdaki gibidir,

  1. Application sınıf içinde - com.nervy.dialer
  2. Datasource sınıf içinde - com.nervy.dialer.common
  3. Varlık sınıfları - com.nervy.dialer.domain
  4. Hizmet sınıfları - com.nervy.dialer.domain.service.impl
  5. Denetleyiciler içeride - com.nervy.dialer.spring.controller
  6. Depo sınıfları - com.nervy.dialer.spring.jpa.repository
  7. WebSecurityConfig içinde - com.nervy.dialer.spring.security

Teşekkürler


1
Yine de, varlık nesneniz için paketi taramasını Hibernate'e söylemeniz gerekeceğine inanıyorum.
chrylis

Yanıtlar:


51

Ben değiştirilmesi düşünüyorum @ComponentScanile @ComponentScan("com.nervy.dialer.domain")irade çalışması.

Düzenle :

BoneCP ile havuzlanmış bir veri kaynağı bağlantısının nasıl kurulacağını göstermek için örnek bir uygulama ekledim.

Uygulama sizinkiyle aynı yapıya sahiptir. Umarım bu, yapılandırma sorunlarınızı çözmenize yardımcı olur


@ComponentScan ("com.nervy.dialer.domain") eklersem, farklı bir pakette olduğu için veri kaynağına düşkün olmayan istisna alıyorum. Bu paket ayrıca @ComponentScan ({"com.nervy.dialer.domain", "com.nervy.dialer.common"}) gibi eklendi. Şimdi aynı eski hatayı alıyorum.
user1578872

1
BoneCP ile havuzlanmış bir veri kaynağı bağlantısının nasıl kurulacağını göstermek için örnek bir uygulama ekledim. github.com/azizunsal/SpringBootBoneCPPooledDataSource Uygulama sizinkiyle aynı yapıya sahiptir. Umarım bu, yapılandırma sorunlarınızı çözmenize yardımcı olur.
azizunsal

Sihri sen yaptın. İyi çalışıyor. Yardımınız için teşekkürler. Veri kaynağında aşağıdaki ek açıklamaya sahiptim. @EnableJpaRepositories (entityManagerFactoryRef = "dialerEntityManagerFactory", transactionManagerRef = "dialerTransactionManager", basePackages = {"com.nervytech.dialer.repository"}). Bunu kaldırdıktan ve DialerApplication'a @EnableJpsRespository'yi ekledikten sonra, iyi çalışmaya başladı.
user1578872

Bende de aynı sorun var. Spring boot Varlığımı tanımıyor (4+ hazırda bekletme sürümünden @DynamicUpdate). Model paketimi ComponentScan veya EntityScan'e eklemeyi denedim ve aynı hatayı alıyorum. Uygulama sınıfındaki Ek Açıklamalarım şunlardır: SpringBootApplication ComponentScan (basePackages = {"com.example.controllers", "com.example.services", "com.example.models"}) EnableAutoConfiguration @Configuration @EnableJpaRepositories (basePackages = {"com. example.dao "," com.example.models "})
Balflear

Bir JPA sağlayıcısı olarak Hibernated'i kullandığımız senaryo. Tüm bu çözümleri denedikten sonra olduğu gibi, sorun hala var. Uygulama yapılandırma dosyama bu yapılandırmayı eklediğimde sorunu çözdüm. hibernate.annotation.packages.to.scan = $ {myEntityPackage}
Robin

112

Spring Boot giriş noktası sınıfında @EntityScan kullanarak varlıkların konumunu yapılandırın .

Eylül 2016'da güncelleme : Spring Boot 1.4+ için: yerine , as ... boot.orm.jpa
kullanın.EntityScan , Spring Boot 1.4'ten itibaren kullanımdan kaldırıldıorg.springframework.boot.autoconfigure.domain.EntityScan
org.springframework.boot.orm.jpa.EntityScan


2
Bu seçenek de yardımcı olmuyor. Sanırım, konfigürasyonumda başka bir şey eksik.
user1578872

3
Benim durumumda da yardımcı olmuyor.
Balflear

1
Benim için çalıştı ama kullanımdan kaldırılmış bir ek açıklama.
Juan Carlos Puerto

Teşekkürler Juan, cevabı Varlık Taramasının mevcut sürümüyle güncelledim.
Manish Maheshwari

78

Aşağıdakilerin tümünü eklemeyi deneyin, benim uygulamamda tomcat ile iyi çalışıyor

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

Yaylı önyükleme kullanıyorum ve gömülü tomcat kullandığımda iyi çalışıyordu @EntityScan("my.package.base.*")ancak uygulamayı harici bir tomcat'e dağıtmaya çalıştığımda not a managed typevarlığım için hata aldım .


Kahramanımsın.
Artur Łysik

27

Benim durumumda sorun, Varlık sınıflarıma @javax.persistence.Entityek açıklama eklemeyi unutmamdan kaynaklanıyordu. Doh!

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

Benim durumumda, @Entityek açıklamada tablo adına da ihtiyacım vardı . Burada örnek bir proje kurdum
mate00

22

Kalıcılık yapılandırmasını başka bir projeden kopyalayıp yapıştırdıysanız, paketi EntityManagerFactory'de manuel olarak ayarlamanız gerekir:

@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 ek açıklamasını kullanabilir ve tüm jpa varlıklarınızı taramak için varlık paketinizi sağlayabilirsiniz. Bu açıklamayı, @SpringBootApplication açıklamasını kullandığınız temel uygulama sınıfınızda kullanabilirsiniz.

örneğin @EntityScan ("com.test.springboot.demo.entity")



12

Bu hatayı aldım çünkü aptalca yazdım

genel arayüz FooBarRepository, CrudRepository <FooBar Repository , Long> {...

Kısa bir açıklama: Biri, FooBar nesnelerini yönetmek için tipik olarak bir FooBarRepository sınıfı oluşturur (genellikle verileri foo_bar gibi bir tablodaki verileri temsil eder.) CrudRepository'yi özel depo sınıfını oluşturmak için genişletirken, yönetilmekte olan türü belirtmek gerekir - bu durum, FooBar. Yine de yanlışlıkla yazdığım şey FooBar yerine FooBarRepository idi. FooBarRepository, FooBarRepository ile yönetmeye çalıştığım tür (sınıf) değil. Bu nedenle, derleyici bu hatayı verir.

Kalın yazmanın yanlış kısmını vurguladım . Örneğimde vurgulanan Depo sözcüğünü silin ve kod derlenir.


6
Hayatımın kurtaramayacağım 15 dakikası
Oscar Moncayo

@TayabHussain, yazıyı bazı açıklamalarla güncelledim. Umarım size yardımcı olur.
Marvo

7

Senin bu koy Application.javadosyası

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

Bu, yukarıdaki cevabın bir kopyasıdır.
Keshu R.

6

Ya sınıf tanımında @Entity'yi kaçırdınız ya da açık bileşen tarama yolunuz var ve bu yol sınıfınızı içermiyor


3

Spring boot 2.0 kullanıyorum ve bunu @ComponentScan ile değiştirerek düzelttim. @EntityScan


1

Aynı sorunu yaşadım, ancak yalnızca JPA gerektiren bahar önyükleme testleri vakalarını çalıştırırken. Sonuç, kendi jpa test konfigürasyonumuzun bir EntityManagerFactory'yi başlatması ve paketleri taranacak şekilde ayarlamasıydı. El ile ayarlıyorsanız, bu açıkça EntityScan parametrelerini geçersiz kılacaktır.

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

Unutulmaması gereken önemli: Eğer hala sıkışmışsanız org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager, setPackagesToScan()yöntemde bir kırılma noktası belirlemeli ve bunun nerede çağrıldığına ve ona hangi paketlerin aktarıldığına bir göz atmalısınız.


1

Spring boot 1.3.x'ten 1.5'e geçiş yaparken bazı problemler yaşadım, EntityManagerFactory bean'de varlık paketini güncelledikten sonra çalıştım

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

Bu fasulye, Uygulama sınıfında aşağıdaki gibi belirtilmiştir

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

}

0

Aynı sorunu yaşıyorum, Spring boot v1.3.x sürümünde yaptığım şey, Spring Boot'u 1.5.7.RELEASE sürümüne yükseltmek. Sonra sorun gitti.



0

Bu sorunu yaşadım çünkü orm.xml dosyasındaki tüm varlıkları eşleştirmedim


0

Aşağıda benim için çalıştı ..

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

Uygulama sınıfımı aşağıdaki gibi üst pakete taşıdım:

Ana sınıf: com.job.application

Varlık: com.job.application.entity

Bu şekilde @EntityScan eklemeniz gerekmez

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.