2015-02-22 7 views
38

Uso Spring boot + JPA e ho un problema all'avvio del servizio.Avvio a molla - Non un tipo gestito

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) 

Ecco il file Application.java,

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

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

Io uso UCP per il pool di connessioni e la configurazione di DataSource è al di sotto,

@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 Attuazione,

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

    @Autowired 
    private UserService userService; 

Servizio attuazione strato,

@Service 
public class PhoneSettingsServiceImpl implements PhoneSettingsService { 

} 

La classe repository,

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

} 

classe Entity,

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

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

} 

I pacchetti sono i seguenti,

1) Application class is in - com.nervy.dialer 
2) Datasource class is in - com.nervy.dialer.common 
3) Entity classes are in - com.nervy.dialer.domain 
4) Service classes are in - com.nervy.dialer.domain.service.impl 
5) Controllers are in - com.nervy.dialer.spring.controller 
6) Repository classes are in - com.nervy.dialer.spring.jpa.repository 
7) WebSecurityConfig is in - com.nervy.dialer.spring.security 

Grazie

+1

Credo che dovrai ancora dire a Hibernate di analizzare il pacchetto per il tuo oggetto entità. – chrylis

risposta

14

Penso sostituzione @ComponentScan con @ComponentScan("com.nervy.dialer.domain") funzionerà.

Edit:

ho aggiunto un sample application per dimostrare come impostare una connessione origine dati in pool con BoneCP.

L'applicazione ha la stessa struttura con la tua. Spero che questo ti aiuti a risolvere i tuoi problemi di configurazione

+0

Se aggiungo @ComponentScan ("com.nervy.dialer.domain"), sto ricevendo l'origine datasource non affetta da quando è in un pacchetto diverso. Aggiunto quel pacchetto anche come @ComponentScan ({"com.nervy.dialer.domain", "com.nervy.dialer.common"}). Ora ottenendo lo stesso vecchio errore. – user1578872

+0

Ho aggiunto un'applicazione di esempio per dimostrare come impostare una connessione di origine dati in pool con BoneCP. https://github.com/azizunsal/SpringBootBoneCPPooledDataSource L'applicazione ha la stessa struttura con la tua. Spero che questo ti aiuterà a risolvere i tuoi problemi di configurazione. – azizunsal

+0

Hai fatto la magia. Funziona bene. Grazie per l'aiuto. Ho avuto la seguente annotazione nell'origine dati. @EnableJpaRepositories (entityManagerFactoryRef = "dialerEntityManagerFactory", transactionManagerRef = "dialerTransactionManager", basePackages = {"com.nervytech.dialer.repository"}). Dopo aver rimosso questo e aggiunto semplicemente @EnableJpsRespository in DialerApplication, ha iniziato a funzionare correttamente. – user1578872

57

Configura la posizione delle entità utilizzando @EntityScan nella classe del punto di ingresso di avvio in primavera.

Aggiornamento a settembre 2016: per Spring Boot 1.4+, utilizzare org.springframework.boot.autoconfigure.domain.EntityScan; come org.springframework.boot.orm.jpa.EntityScan è deprecato a partire dalla primavera Boot 1.4

+0

Anche questa opzione non aiuta. Immagino, mi manca qualcos'altro nella mia configurazione. – user1578872

+0

Non aiuta anche nel mio caso. – Balflear

+0

Ha funzionato per me, ma è un'annotazione deprecata. –

38

Prova ad aggiungere tutte le seguenti, Nella mia applicazione si sta lavorando bene con Tomcat

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

Sto usando avvio di primavera, e quando sto usando Tomcat incorporato è stato funzionava bene senza @EntityScan("my.package.base.*") ma quando ho provato a distribuire l'app su un tomcat esterno ho ricevuto l'errore not a managed type per la mia entità.

6

Nel mio caso il problema era dovuto al fatto che dimenticavo di aver annotato le mie classi di entità con l'annotazione @ javax.persistence.Entity. Doh!

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

È possibile utilizzare @EntityScan annotazione e fornire il proprio pacchetto di entità per la scansione di tutte le entità JPA. È possibile utilizzare questa annotazione sulla classe dell'applicazione di base in cui è stata utilizzata l'annotazione @SpringBootApplication.

ad es. @EntityScan ("com.test.springboot.demo.entity")

2

Si sia persa @Entity sulla definizione di classe o hai componente esplicita percorso di scansione e questo percorso non contiene la classe

0

Ho lo stesso probblem, nella versione spring boot v1.3.x quello che ho fatto è aggiornare il boot di primavera alla versione 1.5.7.RELEASE. Quindi il problema è scomparso.