Spring Boot-不是托管类型


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;

UserDetailsS​​ervice实施,

@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扫描包中的实体对象。
克莱里斯-cautiouslyoptimistic-

Answers:


51

我想更换@ComponentScan@ComponentScan("com.nervy.dialer.domain")意志的工作。

编辑:

我添加了一个示例应用程序,以演示如何使用BoneCP建立池化数据源连接。

该应用程序具有与您相同的结构。我希望这将帮助您解决配置问题


如果我添加@ComponentScan(“ com.nervy.dialer.domain”),我将得到数据源不喜欢的异常,因为它在另一个包中。添加了该软件包,例如@ComponentScan({“ com.nervy.dialer.domain”,“ com.nervy.dialer.common”})。现在得到相同的旧错误。
user1578872 2015年

1
我添加了一个示例应用程序,以演示如何使用BoneCP建立池化数据源连接。github.com/azizunsal/SpringBootBoneCPPooledDataSource该应用程序与您的结构相同。我希望这将帮助您解决配置问题。
2015年

你做了魔术。它工作正常。谢谢你的帮助。我在数据源中具有以下注释。@EnableJpaRepositories(entityManagerFactoryRef =“ dialerEntityManagerFactory”,transactionManagerRef =“ dialerTransactionManager”,basePackages = {“ com.nervytech.dialer.repository”})。删除此内容并仅在DialerApplication中添加@EnableJpsRespository之后,它开始正常工作。
user1578872

我也有同样的问题。Spring Boot无法识别我的Entity(来自Hibernate 4+版本的@DynamicUpdate)。我尝试在ComponentScan或EntityScan中添加模型包,但遇到相同的错误。我在Application类中的注释是:SpringBootApplication ComponentScan(basePackages = {“ com.example.controllers”,“ com.example.services”,“ com.example.models”})EnableAutoConfiguration @Configuration @EnableJpaRepositories(basePackages = {“ com。 example.dao“,” com.example.models“})
Balflear

我们使用Hibernated作为JPA提供程序的情况相同。经过尝试所有这些解决方案后,问题仍然存在。在我的应用程序配置文件中添加此配置后,为我解决了该问题。hibernate.annotation.packages.to.scan = $ {myEntityPackage}
Robin

112

在Spring Boot入口点类中使用@EntityScan配置实体的位置。

2016年9月更新:对于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
此选项也无济于事。我想,我的配置中缺少其他内容。
user1578872'2

3
对我的情况也没有帮助。
Balflear

1
它确实为我工作,但它已弃用。
Juan Carlos Puerto

谢谢胡安,我已经用当前版本的实体扫描更新了答案。
Manish Maheshwari,2016年

78

尝试添加以下所有内容,在我的应用程序中,它与tomcat正常工作

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

我使用的是Spring Boot,当我使用嵌入式tomcat时,它工作得很好, @EntityScan("my.package.base.*")但是当我尝试将应用程序部署到外部tomcat时not a managed type,我的实体出现错误。


你是我的英雄。
ArturŁysik

27

在我的情况下,问题是由于我忘记使用注释对Entity类进行@javax.persistence.Entity注释。h!

//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管理的类型(类)。因此,编译器会发出此错误。

我突出显示了用粗体键入的错误地方。在我的示例中删除突出显示的单词Repository,然后代码将编译。


6
我一生无法恢复的15分钟
奥斯卡·蒙卡约

@TayabHussain,我用一些解释更新了帖子。希望它可以帮助您。
Marvo

7

将此放入您的Application.java文件

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

这是上述答案的重复项。
Keshu R.



1

我有同样的问题,但仅在运行需要JPA的Spring Boot测试用例时才出现。最终结果是,我们自己的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.DefaultPersistenceUnitManagersetPackagesToScan()方法上的处设置一个断点,并查看在何处调用该中断以及将哪些包传递给该中断。


1

从Spring Boot 1.3.x迁移到1.5时遇到了一些问题,在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;
  }

该bean在Application类中的引用如下

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

}

0

我有同样的问题,在spring boot v1.3.x版本中,我所做的是将spring boot升级到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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.