Używam Spring boot + JPA i mam problem z uruchomieniem usługi.
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)
Oto plik Application.java,
@Configuration
@ComponentScan
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
@SpringBootApplication
public class DialerApplication {
public static void main(String[] args) {
SpringApplication.run(DialerApplication.class, args);
}
}
Używam UCp do buforowania połączeń, a konfiguracja DataSource jest poniżej,
@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;
Implementacja usługi UserDetailsService,
@Service("userDetailsService")
@SessionAttributes("user")
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserService userService;
Wdrożenie warstwy usług,
@Service
public class PhoneSettingsServiceImpl implements PhoneSettingsService {
}
Klasa repozytorium,
@Repository
public interface PhoneSettingsRepository extends JpaRepository<PhoneSettings, Long> {
}
Klasa podmiotu,
@Entity
@Table(name = "phone_settings", catalog = "dialer")
public class PhoneSettings implements java.io.Serializable {
Klasa 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());
}
}
Pakiety są następujące,
Application
klasa jest w -com.nervy.dialer
Datasource
klasa jest w -com.nervy.dialer.common
- Klasy jednostek znajdują się w -
com.nervy.dialer.domain
- Zajęcia serwisowe są w -
com.nervy.dialer.domain.service.impl
- Kontrolery są w -
com.nervy.dialer.spring.controller
- Klasy repozytorium znajdują się w -
com.nervy.dialer.spring.jpa.repository
WebSecurityConfig
jest w -com.nervy.dialer.spring.security
Dzięki
spring
spring-mvc
jpa
spring-boot
spring-data
user1578872
źródło
źródło
Odpowiedzi:
Myślę wymianie
@ComponentScan
z@ComponentScan("com.nervy.dialer.domain")
pracy będzie.Edytować :
Dodałem przykładową aplikację, aby zademonstrować, jak skonfigurować połączenie źródła danych w puli z BoneCP.
Aplikacja ma taką samą strukturę jak Twoja. Mam nadzieję, że pomoże ci to rozwiązać problemy z konfiguracją
źródło
Skonfiguruj lokalizację jednostek za pomocą @EntityScan w klasie punktu wejścia Spring Boot.
Aktualizacja z września 2016 r . : W przypadku Spring Boot 1.4+:
użyj
org.springframework.boot.autoconfigure.domain.EntityScan
zamiast
org.springframework.boot.orm.jpa.EntityScan
, as ... boot.orm.jpa.EntityScan jest przestarzały od Spring Boot 1.4źródło
Spróbuj dodać wszystkie następujące elementy, w mojej aplikacji działa dobrze z tomcat
@EnableJpaRepositories("my.package.base.*") @ComponentScan(basePackages = { "my.package.base.*" }) @EntityScan("my.package.base.*")
Używam rozruchu sprężynowego, a kiedy używam osadzonego tomcat, działało dobrze bez wyjścia,
@EntityScan("my.package.base.*")
ale kiedy próbowałem wdrożyć aplikację na zewnętrznym tomcat,not a managed type
wystąpił błąd dla mojej jednostki.źródło
W moim przypadku problem wynikał z tego, że zapomniałem dodać adnotację do moich klas Entity
@javax.persistence.Entity
. No!//The class reported as "not a amanaged type" @javax.persistence.Entity public class MyEntityClass extends my.base.EntityClass { .... }
źródło
@Entity
adnotacji. UstawiłemJeśli konfigurujesz własny EntityManagerFactory Bean lub jeśli skopiowałeś i wkleiłeś taką konfigurację trwałości z innego projektu, musisz ustawić lub dostosować pakiet w konfiguracji EntityManagerFactory :
@Bean public EntityManagerFactory entityManagerFactory() throws PropertyVetoException { HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); vendorAdapter.setGenerateDdl(true); LocalContainerEntityManagerFactoryBean factory; factory = new LocalContainerEntityManagerFactoryBean(); factory.setPackagesToScan("!!!!!!package.path.to.entities!!!!!"); //... }
źródło
Możesz użyć adnotacji @EntityScan i dostarczyć pakiet jednostek do skanowania wszystkich jednostek jpa. Możesz użyć tej adnotacji w swojej podstawowej klasie aplikacji, w której użyto adnotacji @SpringBootApplication.
np. @EntityScan ("com.test.springboot.demo.entity")
źródło
nigdy nie zapomnij dodać @Entity w klasie domeny
źródło
Mam ten błąd bo głupio pisałem
Krótkie wyjaśnienie: zazwyczaj tworzy się klasę FooBarRepository do zarządzania obiektami FooBar (często reprezentującą dane w tabeli zwanej czymś w rodzaju foo_bar). Podczas rozszerzania CrudRepository w celu utworzenia wyspecjalizowanej klasy repozytorium, należy określić typ, który jest zarządzany - w w tym przypadku FooBar. Jednak błędnie wpisałem FooBarRepository zamiast FooBar. FooBarRepository nie jest typem (klasą), którym próbuję zarządzać za pomocą FooBarRepository. Dlatego kompilator wyświetla ten błąd.
Podkreśliłem błędne wpisanie pogrubioną czcionką . Usuń zaznaczone słowo Repository w moim przykładzie i kod zostanie skompilowany.
źródło
Umieść to w swoim
Application.java
pliku@ComponentScan(basePackages={"com.nervy.dialer"}) @EntityScan(basePackages="domain")
źródło
Albo przegapiłeś @Entity w definicji klasy, albo masz jawną ścieżkę skanowania komponentów, a ta ścieżka nie zawiera Twojej klasy
źródło
Używam Spring Boot 2.0 i naprawiłem to, zastępując @ComponentScan
@EntityScan
źródło
Miałem ten sam problem, ale tylko podczas uruchamiania testów rozruchu wiosennego, które wymagały JPA. W rezultacie nasza własna konfiguracja testowa jpa inicjowała EntityManagerFactory i ustawiała pakiety do skanowania. To ewidentnie spowoduje zastąpienie parametrów EntityScan, jeśli ustawiasz je ręcznie.
final LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); factory.setJpaVendorAdapter( vendorAdapter ); factory.setPackagesToScan( Project.class.getPackage().getName()); factory.setDataSource( dataSource );
Ważne, aby pamiętać: jeśli nadal tkwi należy ustawić punkt przerwy w
org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager
sprawiesetPackagesToScan()
sposobu i przyjrzeć się, gdzie to jest nazywane i jakie pakiety są przekazywane do niej.źródło
Miałem problem podczas migracji ze Spring boot 1.3.x do 1.5, działało po zaktualizowaniu pakietu jednostek w fasoli EntityManagerFactory
@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; }
Ta fasola, o której mowa w klasie aplikacji, jak poniżej
@SpringBootApplication @EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryDef") public class SimpleApp { }
źródło
Mam ten sam problem, w wersji spring boot v1.3.x to co zrobiłem to upgrade spring boot do wersji 1.5.7.RELEASE. Wtedy problem zniknął.
źródło
Miałem ten problem, ponieważ nie mapowałem wszystkich jednostek w pliku orm.xml
źródło
Poniżej pracował dla mnie ..
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()); }
}
źródło
Przeniosłem moją klasę aplikacji do pakietu nadrzędnego, takiego jak:
Klasa główna: com.job.application
Jednostka: com.job.application.entity
W ten sposób nie musisz dodawać @EntityScan
źródło