source

스프링 부트 - 비관리형

goodcode 2023. 3. 27. 23:14
반응형

스프링 부트 - 비관리형

Spring Boot+ 사용서비스 시작 중 문제가 발생하였습니다.

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를 사용하고 있으며 Data Source 구성은 다음과 같습니다.

@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;

User Details Service 구현,

@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 {

Web Security Config 클래스,

@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

감사해요.

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에서 폐지되었습니다.

다음을 모두 추가해 보십시오. 내 응용 프로그램에서는 Tomcat에서 정상적으로 작동합니다.

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

부트를 하고 있을 때 out out out 에서는 .@EntityScan("my.package.base.*") "Tomcat"이 떴습니다.not a managed type러입니니다다

추가 읽기:

@ComponentScan 、 시 、 is 、 is 、 as as as as as as as as as as as as as as as as as as as as as as as as as as as 로 표시된 모든 사용됩니다.@Controller, @Service, @Repository, @Component인쇄...

서 「」라고 합니다.@EntityScan 、 「 」라고 되어 엔티티를 하기 사용합니다.@Entity어플리케이션에 설정되어 있는 모든 JPA에 대해 설명합니다.

가 될 것 요.@ComponentScan@ComponentScan("com.nervy.dialer.domain")과가있있 있있있다다

편집:

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

그 어플리케이션은 당신의 어플리케이션과 같은 구조로 되어 있습니다.이것이 구성 문제를 해결하는 데 도움이 되기를 바랍니다.

독자적인 Entity Manager Factory Bean을 설정하거나 다른 프로젝트에서 이러한 지속성 구성을 복사 붙여넣은 경우 Entity Manager Factory 설정에서 패키지를 설정 또는 조정해야 합니다.

@Bean
public EntityManagerFactory entityManagerFactory() throws PropertyVetoException {
    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setGenerateDdl(true);
    LocalContainerEntityManagerFactoryBean factory;
    factory = new LocalContainerEntityManagerFactoryBean();
    factory.setPackagesToScan("!!!!!!package.path.to.entities!!!!!");
    //...
}

복수의 요구에 주의해 주세요.인수가 set Packages에 전달되었을 때 String 배열이 필요합니다.ToScan(콤마 구분 단일 문자열 값 아님)이 문제를 다음에 나타냅니다.

    String[] packagesArray = "com.mypackage1,com.mypackage2".split(",");
    em.setPackagesToScan(packagesArray);

였습니다.@javax.persistence.Entity석입 do doh도도 !

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

이 오류는 제가 바보같이 썼기 때문입니다.

퍼블릭 인터페이스 FooBarRepository가 CrudRepository <FooBarRepository, Long> {...

간단한 설명:일반적으로 FooBarRepository 클래스를 생성하여 FooBar 객체를 관리합니다(많은 경우 foo_bar라고 하는 테이블 내의 데이터를 나타냅니다).CrudRepository를 확장하여 전용 리포지토리 클래스를 만드는 경우 관리할 유형(이 경우 FooBar)을 지정해야 합니다.그러나 내가 잘못 입력한 것은 FooBar가 아니라 FooBarRepository였다.FooBarRepository는 FooBarRepository로 관리하려는 유형이 아닙니다.따라서 컴파일러는 이 오류를 발행합니다.

굵은 글씨로 잘못 입력한 부분을 강조 표시했습니다.예제에서 강조 표시된 Repository와 코드 컴파일을 삭제합니다.

@EntityScan 주석을 사용하여 모든 jpa 엔티티를 스캔하기 위한 엔티티 패키지를 제공할 수 있습니다.이 주석은 @SpringBootApplication 주석을 사용한 기본 응용 프로그램 클래스에서 사용할 수 있습니다.

예: @EntityScan("com.test.springboot.demo.entity")

도메인 클래스에 @Entity를 추가하는 것을 잊지 마십시오.

6및이가 발생하였습니다.Spring Version 6 " JDK 17 " 을 사용하고 .javax.persistent.Entity했을 때jakarta.persistent.Entity

을 당신의 것 your your this에 넣으세요.Application.java

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

클래스 정의에 @Entity가 없거나 명시적인 컴포넌트 스캔 경로가 있으며 이 경로에 클래스가 포함되어 있지 않습니다.

응용 프로그램클래스를 다음과 같은 부모 패키지로 이동했습니다.

메인 클래스: com.job.application

엔티티: com.job.application.entity

이렇게 하면 @EntityScan을 추가할 필요가 없습니다.

2. @을 @ComponentScan 2.0으로 이 했습니다.@EntityScan

같은 문제가 있었습니다만, JPA가 필요한 스프링 부트 테스트 케이스를 실행하는 경우 뿐입니다.그 결과 자체 jpa 테스트 구성이 Entity Manager Factory를 초기화하고 패키지를 스캔하도록 설정했습니다.수동으로 설정할 경우 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()메서드를 사용하여 이 호출처와 전달되는 패키지를 확인합니다.

제 경우 엔티티 클래스가 아닌 JpaRepository 파라미터로 저장소 클래스를 사용하는 실수를 했습니다.다음과 같이 합니다.

@Repository
public interface BuyerInspectionRepository extends JpaRepository<BuyerInspectionRepository,Long> {

}

저장소 클래스를 엔티티 클래스로 대체했습니다.어떤 것이 구매자입니까?감사.

@Repository
public interface BuyerInspectionRepository extends JpaRepository<BuyerInspection,Long> {

}

멀티 모듈 메이븐 프로젝트

는 알고 있다@EntityScan을 사용하다

하지만 멀티모듈 메이븐 프로젝트를 다룰 문제가 자주 발생할 수 있다는 을 강조할 필요가 있다고 느꼈습니다.

제 경우 멀티모듈 메이븐 프로젝트가 있었는데, 여기서 하나의 모듈은model및 는 '''입니다.microservices 에서 정의한 model package(도메인이 내 프로젝트에서 호출됨), 나는 다음 명령어를 추가해야 했다.@EntityScan(basePackages = {"com.example.domain"})의 주석@SpringBootApplication class:

@SpringBootApplication
@EnableEurekaClient
@EntityScan(basePackages = {"com.example.domain"}) // add this so the spring boot context knows where to look for entities
public class DoctorServiceApplication {

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

}

나처럼 명백한 실수를 하지 말고 템플리트 활자의 순서를 틀려라.다음과 같은 템플릿 선언문에 먼저 ID가 없는지 확인합니다.

public interface CapacityBasedProductRepository extends JpaRepository<Long, CapacityBasedProduct> {
}

다음과 같이 JPA 클래스가 첫 번째이고 ID 열 유형이 두 번째입니다.

public interface CapacityBasedProductRepository extends JpaRepository<CapacityBasedProduct, Long> {
}

않으면 '불만하다'고 .java.lang.Long알 수 없는 엔티티 유형입니다.첫 번째 항목을 사용하여 사용할 엔티티를 찾습니다.

가 비슷한 Not a managed type.

자세한 내용은 다음과 같습니다.

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stockPriceRepository' defined in com.example.stockclient.repository.StockPriceRepository defined in @EnableJpaRepositories declared on StockUiApplication: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.example.stockclient.StockPrice

Spring Data JPA을 알 가 있다JPA그하기 입니다.JPA장소입입니니다

내 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★@EnableJpaRepositories 하게 하다JPA패키지에 , 「」가 없는 .@EntityScan.

★★★★★★★★★★★★★★★★ @EntityScan 이야기였습니다.@EnableJpaRepositories엔티티 클래스는 멀티프로젝트 때문에 메인 어플리케이션 패키지에 배치되지 않았기 때문입니다.

상세한 것에 대하여는, 예를 들면 이 기사를 참조해 주세요.

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;
  }

이 콩은 아래와 같이 어플리케이션클래스에서 참조됩니다.

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

}

나의 경우, 나는 잘못 수업을 수입하고 있었다.jakarta.persistence-api.

로부터의 Import »javax.persistence.*: 작업 완료:

package foo;
import javax.persistence.Entity;

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

비슷한 문제에 직면했다.내 경우 저장소와 관리되고 있는 유형이 동일한 패키지가 아닌 경우.

이 문제를 해결하는 또 다른 방법은 ...이다.@SpringBootApplication을 포함하는 클래스의 패키지는 루트로 하고 다른 모든 패키지는 자여야 합니다.예를 들어 다음과 같습니다.

package com.home

@SpringBootApplication
public class TestApplication{
  springapplication.run....
}
 
package com.home.repo

@Repository
public interface StudentRepo implements JpaRepository<Student, int>{
 ..........
}

package com.home.entity

@Entity
@Table(name = "student")
public class Student{
 ..........
}

내 경험에 비추어 볼 때, 당신은 당신의 주석을 확인해야 합니다.으로 쓸 콩으로 써야 요.@Component로서 「」를 사용할 가 있습니다@Entity신신반반반반반더더더더

같은 문제가 발생하고 있습니다.스프링 부트 v1.3.x 버전에서는 스프링 부트를 버전 1.5.7로 업그레이드했습니다.풀어주다.그럼 문제가 사라졌군

아래는 나에게 효과가 있었다.

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

}

Multi Module Spring Data JPA 프로젝트를 사용하는 경우

여러 모듈로 작업하는 경우 JPA 엔티티와 리포지토리가 있습니다.이거면 될 것 같아.외부 Tomcat(내장 Tomcat에서는 한 번도 마주한 적이 없음)에 전개할 때 "Not managed type(관리형 아님)" 오류가 발생하곤 했습니다.

저는 1개의 메인 모듈과 2개의 다른 모듈이 종속되어 있었습니다.메인 프로젝트를 전쟁으로 전개했을 때, 총 3개의 Spring 어플리케이션이 초기화되는 것을 볼 수 있었습니다.실행순서가 먼저 메인모듈, 다음으로 자모듈일 경우 오류는 발생하지 않았습니다.단, 메인 모듈보다 먼저 하위 모듈이 호출되는 경우가 있습니다.이는 "관리형 엔티티 예외 없음"을 발생시키는 데 사용되었습니다.

까다로운 것은 스프링 부트 내장형 Tomcat에서 오류가 나타나지 않는다는 것입니다.하지만 외부 Tomcat에 도입하면이 예외는 너무 무작위로 찾아오곤 했다.질서를 바로잡기 위해 같은 전쟁을 여러 번 치러야 했습니다.

나는 그 문제를 해결하려고 온종일 애를 썼다.그러나 메인 모듈의 종속성으로 다른 모듈을 추가하는 방법이 문제인 것으로 나타났습니다.스프링 부트 모듈을 다른 프로젝트에 종속 요소로 추가할 경우 메인 클래스가 jar에 포함되지 않았는지 확인하십시오.또 다른 스프링 부트프로젝트를 의존관계로 두고 프로젝트를 전쟁으로 전개하려고 할 때.주 응용 프로그램 클래스의 실행 순서가 보장되지 않습니다.메인 클래스를 삭제하면 기본적으로 하위 모듈이 독립적으로 실행되지 않습니다.따라서 집행명령 문제가 발생할 여지가 없습니다.

향후 독자의 경우:

다음은 검색할 여러 패키지에 대한 구문 설탕입니다.

주의: 2개의 패키지도 다른 항아리 안에 있습니다만, 패키지가 주된 드라이버입니다.내 병 두 개에 대한 상황을 메모하는 거야

    em.setPackagesToScan(new String[] {"com.package.ONE.jpa.entities" , "com.package.TWO.jpa.entities"});

원래의 ERANT 코드는 다음과 같습니다.

    em.setPackagesToScan("com.package.ONE.jpa.entities, com.package.TWO.jpa.entities");

나를 실망시킨 것은 "xml에서 java-config로의 스왑오버"였다.다음은 쉼표로 구분된 단순한 값을 보여 줍니다.

쉼표로 구분된 리스트는 di.xml에서는 동작하지만 "java config"에서는 동작하지 않습니다.

자바, 그리고 그것은 ::: "그것은 언제 쉼표로 구분되고, 그것이 스트링 배열일 때, 언제 스트링 바라그일 때"...... 지그쏘 퍼즐은 때때로 나를 미치게 한다.

    <!-- the value of "id" attribute below MUST BE "entityManagerFactory"  spring-data voodoo -->
    <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="com.package.ONE.jpa.entities, com.package.TWO.jpa.entities"/>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="${spring.jpa.show-sql}"/>
                <property name="generateDdl" value="${spring.jpa.generate-ddl}"/>
            </bean>
        </property>
        <!-- See https://stackoverflow.com/questions/16088112/how-to-auto-detect-entities-in-jpa-2-0/16088340#16088340 -->
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">${spring.jpa.hibernate.ddl-auto}</prop>
                <prop key="hibernate.dialect">${spring.jpa.properties.hibernate.dialect}</prop>
            </props>
        </property>
    </bean>

해 둘 가 있습니다. 하지만 주목할 만한 점은 Not a managed type오류는 패키지 레터 케이스에서도 발생할 수 있습니다., 스캔 패키지가 「」라고 .myEntities에서는, 「」을 제공하고 있습니다.myentities어떤 기계에서는 동작하지만 다른 기계에서는 동작하지 않을 수 있으므로 레터 케이스에 주의해 주십시오.

Session Factory를 EMF로 사용하는 경우:

이 경우 새로운 엔티티 유형을 Hibernate 설정에 주석 클래스로 포함시키는 것을 잊은 것이 문제였습니다.

따라서 SessionFactory bean에는 새로운 엔티티 유형에 대해 다음 행을 포함해야 합니다.

configuration.addAnnotatedClass(MyEntity.class);

application.properties 파일에 아래와 같이 추가함으로써 이 문제를 해결할 수 있었습니다.

spring.jpa.2011com.display.display와 같은 엔티티 폴더의 ToScan= 경로입니다.

언급URL : https://stackoverflow.com/questions/28664064/spring-boot-not-a-managed-type

반응형