स्प्रिंग बूट - प्रबंधित प्रकार नहीं है


137

मैं स्प्रिंग बूट + जेपीए का उपयोग करता हूं और सेवा शुरू करते समय समस्या आती है।

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

मैं कनेक्शन पूलिंग के लिए यूसीपी का उपयोग करता हूं और डेटा स्रोत विन्यास नीचे है,

@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
मेरा मानना ​​है कि आपको अपनी इकाई वस्तु के लिए पैकेज को स्कैन करने के लिए अभी भी हाइबरनेट को बताना होगा।
चिर्लिस -कुट्योप्टोफिमिस्टिक-

जवाबों:


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 एप्लिकेशन में आपके लिए समान संरचना है। मुझे आशा है कि यह आपकी कॉन्फ़िगरेशन समस्याओं को हल करने में आपकी सहायता करेगा।
अज़ीज़ुनसाल

तुमने जादू कर दिया। यह बढ़िया काम करता है। आपकी सहायता के लिए धन्यवाद। मैं डेटा स्रोत में निम्नलिखित एनोटेशन था। @EnableJpaRepositories (unitManagerFactoryRef = "dialerEntityManagerFactory", transactionManagerRef = "dialerTransactionManager", basePackages = {"com.nervytech.dialer.repository"})। इसे हटाने के बाद और डायलरैपेशन में केवल @EnableJpsRespository को जोड़ने के बाद, यह ठीक काम करने लगा।
user1578872

मेरी भी यही समस्या है। स्प्रिंग बूट मेरी इकाई (हाइबरनेट 4+ संस्करण से @ डायनामिक यूपीडेट) को नहीं पहचानता है। मैंने अपने मॉडल पैकेज को ComponentScan या EntityScan में जोड़ने की कोशिश की है और मुझे वही त्रुटि मिली है। अनुप्रयोग वर्ग में मेरे एनोटेशन हैं: स्प्रिंगबुटएप्लीकेशन कंपोनेंटसकैन (बेसपेकेज = {"com.example.controllers", "com.example.services", "com.example.models"}} EnableAutoConfiguration @Configuration @EnableJpaRepositories (बेस -पैकेज)। example.dao "," com.example.models "})
Balflear

उसी परिदृश्य को हमने हाइबरनेट का उपयोग जेपीए प्रदाता के रूप में किया था। जैसा कि इन सभी समाधानों की कोशिश के बाद भी समस्या मौजूद है। मेरी कॉन्फ़िगरेशन कॉन्फ़िगरेशन फ़ाइल में इस कॉन्फ़िगरेशन को जोड़ा गया मेरे लिए समस्या हल हो गई। hibernate.annotation.packages.to.scan = $ {myEntityPackage}
रॉबिन

112

स्प्रिंग बूट प्रविष्टि बिंदु वर्ग में @EntityScan का उपयोग करके संस्थाओं का स्थान कॉन्फ़िगर करें ।

सितम्बर 2016 पर अपडेट : स्प्रिंग बूट 1.4+ के लिए: के बजाय का
उपयोग करें ... boot.orm.jpa.EntityScan स्प्रिंग बूट 1.4 के रूप में पदावनत हैorg.springframework.boot.autoconfigure.domain.EntityScan
org.springframework.boot.orm.jpa.EntityScan


2
यह विकल्प भी मदद नहीं करता है। मुझे लगता है, मुझे अपने कॉन्फ़िगरेशन में कुछ और याद आ रहा है।
user1578872

3
मेरे मामले में भी मदद नहीं करता है।
बालफ्लियर

1
इसने मेरे लिए काम किया लेकिन यह एक अस्वीकृत एनोटेशन है।
जुआन कार्लोस पर्टो

धन्यवाद जुआन, मैंने एंटिटी स्कैन के वर्तमान संस्करण के साथ उत्तर को अपडेट किया है।
मनीष माहेश्वरी

78

निम्नलिखित सभी को जोड़ने का प्रयास करें, मेरे आवेदन में यह टॉमकैट के साथ ठीक काम कर रहा है

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

मैं स्प्रिंग बूट का उपयोग कर रहा हूं, और जब मैं एम्बेडेड टॉमकैट का उपयोग कर @EntityScan("my.package.base.*")रहा हूं तो यह ठीक काम कर रहा था, लेकिन जब मैंने ऐप को एक बाहरी टॉमकैट में तैनात करने की कोशिश की तो मुझे not a managed typeअपनी इकाई के लिए त्रुटि मिली ।


आप मेरे हीरो हैं।
अर्तुर Artयस्क

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 का उपयोग कर सकते हैं एनोटेशन का और अपने सभी संस्थाओं को स्कैन करने के लिए अपना इकाई पैकेज प्रदान । आप इस एनोटेशन का उपयोग अपने आधार एप्लिकेशन वर्ग पर कर सकते हैं जहाँ आपने @SpringBootApplication एनोटेशन का उपयोग किया है।

उदा @EityityScan ("com.test.springboot.demo.entity")



12

मुझे यह त्रुटि मिली क्योंकि मैंने बेवकूफी से लिखा था

सार्वजनिक इंटरफ़ेस FooBarRepository का विस्तार CrudRepository <FooBar Repository , Long> {...

एक संक्षिप्त विवरण: एक आम तौर पर FooBar ऑब्जेक्ट्स को प्रबंधित करने के लिए एक FooBarRepository वर्ग बनाता है (अक्सर तालिका में डेटा का प्रतिनिधित्व करता है जिसे foo_bar जैसी चीज़ कहा जाता है।) विशेष रिपॉजिटरी क्लास बनाने के लिए CrudRepository का विस्तार करते हुए, किसी को उस प्रकार को निर्दिष्ट करने की आवश्यकता होती है जिसे प्रबंधित किया जा रहा है - जिसमें। यह मामला, FooBar। हालांकि मैंने गलती से टाइप किया था, हालांकि, FooBar के बजाय FooBarRepository था। FooBarRepository प्रकार (वर्ग) नहीं है जिसे मैं FooBarRepository के साथ प्रबंधित करने का प्रयास कर रहा हूं। इसलिए, कंपाइलर इस त्रुटि को जारी करता है।

मैंने बोल्ड में गलत टाइपिंग को उजागर किया । मेरे उदाहरण में हाइलाइट किए गए शब्द रिपॉजिटरी को हटाएं और कोड संकलित करें।


6
मेरे जीवन के 15 मिनट जिन्हें मैं ठीक नहीं कर पाऊंगा
ऑस्कर मोनकायो

@TayabHussain, मैंने कुछ स्पष्टीकरण के साथ पोस्ट को अपडेट किया। आशा है कि यह आपकी मदद करता है।
मार्वो


6

आप वर्ग परिभाषा पर @Entity से चूक गए हैं या आपके पास स्पष्ट घटक स्कैन पथ है और इस पथ में आपकी कक्षा नहीं है


3

मैं स्प्रिंग बूट 2.0 का उपयोग कर रहा हूं और मैंने @ComponentScan को बदलकर इसे ठीक किया है @EntityScan


1

मुझे भी यही समस्या थी, लेकिन स्प्रिंग बूट परीक्षण के मामलों को चलाने के दौरान जेपीए की आवश्यकता थी। अंतिम परिणाम यह था कि हमारा अपना जपा परीक्षण विन्यास एक एंटिटीमैनेजरफैक्ट्री को इनिशियलाइज़ कर रहा था और स्कैन करने के लिए पैकेज सेट कर रहा था। यदि आप इसे मैन्युअल रूप से सेट कर रहे हैं तो यह जाहिर तौर पर 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

स्प्रिंग बूट 1.3.x से 1.5 पर माइग्रेट करते समय मुझे कुछ समस्या थी, मुझे EntityManagerFile बीन में एंटिटी पैकेज अपडेट करने के बाद काम करना पड़ा

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

}

0

मेरे पास एक ही प्रोबेलम है, संस्करण स्प्रिंग बूट v1.3.x में मैंने जो किया वह वसंत बूट को 1.5.7 संस्करण में उन्नत किया है। फिर प्रोब्लम चली गई।


मैं 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 नहीं जोड़ना होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.