春のブーツ-管理されたタイプではありません


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に指示する必要があると思います。
chrylis -cautiouslyoptimistic-

回答:


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"})。これを削除し、@ EnableJpsRespositoryをDialerApplicationに追加しただけで、正常に動作し始めました。
user1578872

私は同じ問題を抱えています。スプリングブートがエンティティを認識しません(Hibernate 4以降のバージョンの@DynamicUpdate)。ComponentScanまたはEntityScanにモデルパッケージを追加しようとしましたが、同じエラーが発生します。アプリケーションクラスの注釈は次のとおりです。SpringBootApplicationComponentScan(basePackages = {"com.example.controllers"、 "com.example.services"、 "com.example.models"})EnableAutoConfiguration @Configuration @EnableJpaRepositories(basePackages = {"com。 example.dao "、" com.example.models "})
Balflear

JPAプロバイダーとしてHibernatedを使用した同じシナリオ。これらすべての解決策を試した後も問題は存在します。この構成をアプリケーション構成ファイルに追加すると、問題が解決しました。hibernate.annotation.packages.to.scan = $ {myEntityPackage}
ロビン

112

Spring Bootエントリポイントクラスで@EntityScanを使用してエンティティの場所を構成します。

2016年9月の更新:Spring Boot 1.4以降の場合:...の 代わりに
使用... boot.orm.jpa.EntityScanはSpring Boot 1.4で非推奨になりましたorg.springframework.boot.autoconfigure.domain.EntityScan
org.springframework.boot.orm.jpa.EntityScan


2
このオプションも役に立ちません。たぶん、私は私の構成に何か他のものを欠いています。
user1578872 2015

3
私の場合も役に立ちません。
Balflear 2016年

1
私にとってはうまくいきましたが、非推奨のアノテーションです。
ファンカルロスプエルト

Juanに感謝します。現在のバージョンのエンティティスキャンで回答を更新しました。
Manish Maheshwari 2016

78

次のすべてを追加してみてください、私のアプリケーションではtomcatでうまく機能しています

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

私はスプリングブートを使用していますが、組み込みのTomcatを使用して@EntityScan("my.package.base.*")いるときは問題なく機能していました が、外部のTomcatにアプリをデプロイしようとするnot a managed typeと、エンティティにエラーが発生しました。


あなたは私のヒーローです。
ArturŁysik

27

私の場合、問題は、Entityクラスに@javax.persistence.Entity注釈を付けたことを忘れたことによるものでした。どー!

//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 extends CrudRepository <FooBar Repository、Long> {...

簡単な説明:通常、FooBarオブジェクトを管理するためにFooBarRepositoryクラスを作成します(多くの場合、foo_barなどのテーブルのデータを表します)。CrudRepositoryを拡張して、専用のリポジトリクラスを作成する場合、管理するタイプを指定する必要があります。この場合、FooBar。しかし、誤って入力したのはFooBarではなくFooBarRepositoryでした。FooBarRepositoryは、FooBarRepositoryで管理しようとしているタイプ(クラス)ではありません。したがって、コンパイラはこのエラーを発行します。

タイピングの誤った部分を太字で強調しました。例で強調表示されているリポジトリを削除すると、コードがコンパイルされます。


6
回復できない15分の人生
オスカーモン

@TayabHussain、私はいくつかの説明で投稿を更新しました。お役に立てば幸いです。
Marvo

7

これをApplication.javaファイルに入れてください

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

これは上記の回答の複製です。
Keshu R.

6

クラス定義で@Entityを逃したか、明示的なコンポーネントスキャンパスがあり、このパスにクラスが含まれていません


3

私はSpring Boot 2.0を使用していますが、@ ComponentScanを次のように置き換えることでこれを修正しました @EntityScan


1

私はこれと同じ問題を抱えていましたが、JPAを必要とするスプリングブートテストケースを実行しているときだけでした。最終結果は、私たち自身の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への移行中に問題が発生しました。EntityManagerFactoryBeanでエンティティパッケージを更新した後、問題が発生しました

  @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

私は同じ問題を抱えていますが、バージョンスプリングブートv1.3.xでは、スプリングブートをバージョン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を追加する必要はありません

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.