2015-02-22 24 views
38

Tôi sử dụng Khởi động mùa xuân + JPA và gặp sự cố khi khởi động dịch vụ.Khởi động mùa xuân - Không phải loại được quản lý

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) 

Dưới đây là file Application.java,

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

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

tôi sử dụng UCP cho kết nối tổng hợp và cấu hình DataSource là dưới đây,

@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 thực hiện,

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

    @Autowired 
    private UserService userService; 

Dịch vụ thực hiện lớp,

@Service 
public class PhoneSettingsServiceImpl implements PhoneSettingsService { 

} 

Lớp kho,

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

} 

Entity class,

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

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

} 

Các gói như sau,

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 

Cảm ơn

+1

Tôi tin rằng bạn vẫn sẽ cần phải thông báo cho Hibernate để quét gói cho đối tượng đối tượng của bạn. – chrylis

Trả lời

14

Tôi nghĩ rằng thay @ComponentScan với @ComponentScan("com.nervy.dialer.domain") sẽ làm việc.

Edit:

Tôi đã thêm một sample application để chứng minh làm thế nào để thiết lập một kết nối nguồn dữ liệu gộp với BoneCP.

Ứng dụng có cùng cấu trúc với bạn. Tôi hy vọng điều này sẽ giúp bạn giải quyết các sự cố cấu hình của bạn

+0

Nếu tôi thêm @ComponentScan ("com.nervy.dialer.domain"), tôi sẽ nhận được nguồn dữ liệu không thích ngoại lệ vì nó nằm trong một gói khác. Đã thêm gói đó cũng giống như @ComponentScan ({"com.nervy.dialer.domain", "com.nervy.dialer.common"}). Bây giờ gettting cùng một lỗi cũ. – user1578872

+0

Tôi đã thêm một ứng dụng mẫu để chứng minh cách thiết lập kết nối nguồn dữ liệu gộp với BoneCP. https://github.com/azizunsal/SpringBootBoneCPPooledDataSource Ứng dụng này có cùng cấu trúc với bạn. Tôi hy vọng điều này sẽ giúp bạn giải quyết vấn đề cấu hình của bạn. – azizunsal

+0

Bạn đã làm phép thuật. Nó hoạt động tốt. Cảm ơn bạn đã giúp đỡ. Tôi đã có chú thích sau trong nguồn dữ liệu. @EnableJpaRepositories (entityManagerFactoryRef = "dialerEntityManagerFactory", transactionManagerRef = "dialerTransactionManager", basePackages = {"com.nervytech.dialer.repository"}). Sau khi loại bỏ điều này và chỉ cần thêm @EnableJpsRespository trong DialerApplication, nó bắt đầu hoạt động tốt. – user1578872

57

Định cấu hình vị trí của các thực thể bằng cách sử dụng @EntityScan trong lớp điểm khởi động khởi động mùa xuân.

Cập nhật vào tháng 9 năm 2016: Đối với Spring Boot 1.4+, hãy sử dụng org.springframework.boot.autoconfigure.domain.EntityScan; như org.springframework.boot.orm.jpa.EntityScan bị phản đối như xuân Boot 1.4

+0

Tùy chọn này cũng không hữu ích. Tôi đoán, tôi đang thiếu một cái gì đó khác trong cấu hình của tôi. – user1578872

+0

Không giúp ích gì trong trường hợp của tôi. – Balflear

+0

Nó đã làm việc cho tôi nhưng đó là một chú thích không được chấp nhận. –

38

Hãy thử thêm Tất cả những điều sau đây, Trong ứng dụng của tôi nó đang làm việc tốt với tomcat

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

Tôi đang sử dụng khởi động mùa xuân, và khi tôi đang sử dụng tomcat nhúng nó là làm việc tốt với ra @EntityScan("my.package.base.*") nhưng khi tôi đã cố gắng triển khai các ứng dụng cho một tomcat bên ngoài tôi có lỗi not a managed type cho thực thể của tôi.

6

Trong trường hợp của tôi, sự cố là do tôi quên đã chú thích các lớp Thực thể của tôi bằng chú thích @ javax.persistence.Entity. Doh!

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

Bạn có thể sử dụng @EntityScan chú thích và cung cấp gói thực thể của bạn để quét tất cả các thực JPA của bạn. Bạn có thể sử dụng chú thích này trên lớp ứng dụng cơ sở của bạn, nơi bạn đã sử dụng chú thích @SpringBootApplication.

ví dụ: @EntityScan ("com.test.springboot.demo.entity")

2

Bạn có thể bỏ lỡ @Entity vào định nghĩa lớp hoặc bạn có phần rõ ràng quét đường và con đường này không chứa lớp học của bạn

0

Tôi có cùng một biểu tượng, trong phiên bản khởi động mùa xuân v1.3.x những gì tôi đã làm là nâng cấp khởi động mùa xuân lên phiên bản 1.5.7.RELEASE. Sau đó, các biểu tượng đã biến mất.

Các vấn đề liên quan