스프링 부트-관리 형이 아님


137

스프링 부트 + 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;

UserDetailsService 구현,

@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-신중하게 낙관적-2

답변:


51

나는 교체 @ComponentScan로 생각@ComponentScan("com.nervy.dialer.domain") 가 합니다.

편집하다 :

샘플 애플리케이션 을 추가했습니다BoneCP와 풀링 된 데이터 소스 연결을 설정하는 방법을 보여주는 을 .

응용 프로그램은 당신과 같은 구조를 가지고 있습니다. 이것이 구성 문제를 해결하는 데 도움이되기를 바랍니다.


@ComponentScan ( "com.nervy.dialer.domain")을 추가하면 다른 패키지에 있으므로 데이터 소스가 예외를 좋아하지 않습니다. @ComponentScan ({ "com.nervy.dialer.domain", "com.nervy.dialer.common"})과 같은 패키지를 추가했습니다. 이제 같은 오래된 오류가 발생합니다.
user1578872

1
BoneCP와 풀링 된 데이터 소스 연결을 설정하는 방법을 보여주는 샘플 응용 프로그램을 추가했습니다. github.com/azizunsal/SpringBootBoneCPPooledDataSource 응용 프로그램은 사용자의 구조와 동일합니다. 이것이 구성 문제를 해결하는 데 도움이되기를 바랍니다.
azizunsal

당신은 마술을했다. 잘 작동합니다. 당신의 도움을 주셔서 감사합니다. 데이터 소스에 다음 주석이 있습니다. @EnableJpaRepositories (entityManagerFactoryRef = "dialerEntityManagerFactory", transactionManagerRef = "dialerTransactionManager", basePackages = { "com.nervytech.dialer.repository"}). 이것을 제거하고 DialerApplication에 @EnableJpsRespository를 추가하면 정상적으로 작동하기 시작했습니다.
user1578872

나도 같은 문제가있어. 스프링 부트가 내 엔티티 (최대 절전 모드 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

동일한 시나리오를 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

3
내 경우에도 도움이되지 않습니다.
Balflear

1
그것은 나를 위해 작동했지만 더 이상 사용되지 않는 주석입니다.
Juan Carlos Puerto

고마워 Juan, 나는 현재 버전의 엔티티 스캔으로 답을 업데이트했다.
Manish Maheshwari

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

필자의 경우 문제는 주석으로 엔티티 클래스에 @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는 CrudRepository <FooBar Repository , Long> {...

간단한 설명 : 일반적으로 FooBar 객체를 관리하기 위해 FooBarRepository 클래스를 만듭니다 (종종 foo_bar와 같은 테이블의 데이터를 나타냄). CrudRepository를 확장하여 특수 저장소 클래스를 만들 때 관리되는 유형을 지정해야합니다. 이 경우 FooBar입니다. 내가 실수로 입력 한 것은 FooBar가 아닌 FooBarRepository였습니다. FooBarRepository는 FooBarRepository로 관리하려고하는 유형 (클래스)이 아닙니다. 따라서 컴파일러는이 오류를 발생시킵니다.

나는 굵은 글씨 로 잘못 입력 한 부분을 강조했다 . 예제에서 강조 표시된 단어 Repository를 삭제하면 코드가 컴파일됩니다.


6
내가 회복 할 수없는 내 인생의 15 분
Oscar Moncayo

@TayabHussain, 나는 약간의 설명으로 게시물을 업데이트했습니다. 그것이 당신을 도울 수 있기를 바랍니다.
Marvo

7

이것을 당신의 Application.java파일에 넣으십시오

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

위의 답변과 중복됩니다.
Keshu R.

6

클래스 정의에서 @Entity가 누락되었거나 명시적인 구성 요소 스캔 경로가 있으며이 경로에 클래스가 포함되어 있지 않습니다.



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.DefaultPersistenceUnitManager경우 setPackagesToScan()메서드 에 중단 점을 설정하고 이것이 호출되는 위치와 전달되는 패키지를 확인해야합니다.


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

스프링 부트 v1.3.x 버전에서 동일한 문제가 있습니다. 스프링 부트를 버전 1.5.7.RELEASE로 업그레이드하는 것입니다. 그런 다음 문제가 사라졌습니다.


나는 1.5.6로 전환하고 문제를 가지고 다음 1.3.x 버전에 있던
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.