Spring boot - не управляемый тип
Я использую 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;
Реализация 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 class is in - com.nervy.dialer
2) Datasource class is in - com.nervy.dialer.common
3) Entity classes are in - com.nervy.dialer.domain
4) Service classes are in - com.nervy.dialer.domain.service.impl
5) Controllers are in - com.nervy.dialer.spring.controller
6) Repository classes are in - com.nervy.dialer.spring.jpa.repository
7) WebSecurityConfig is in - com.nervy.dialer.spring.security
Спасибо
Ответы
Ответ 1
Я думаю, что замена @ComponentScan
на @ComponentScan("com.nervy.dialer.domain")
будет работать.
Изменить:
Я добавил приложение , чтобы продемонстрировать, как настроить объединенное соединение с источником данных с BoneCP.
Приложение имеет ту же структуру, что и ваша. Я надеюсь, что это поможет вам решить проблемы с конфигурацией.
Ответ 2
Сконфигурируйте расположение сущностей с помощью @EntityScan в классе точки входа Spring Boot.
Обновление от сентября 2016: для весенней загрузки 1. 4+:
используйте org.springframework.boot.autoconfigure.domain.EntityScan
вместо org.springframework.boot.orm.jpa.EntityScan
, так как... boot.orm.jpa.EntityScan устарело с Spring Boot 1.4
Ответ 3
Попробуйте добавить все следующее: в моем приложении он отлично работает с tomcat
@EnableJpaRepositories("my.package.base.*")
@ComponentScan(basePackages = { "my.package.base.*" })
@EntityScan("my.package.base.*")
Я использую загрузку spring, и когда я использую встроенный tomcat, он отлично работал с @EntityScan("my.package.base.*")
, но когда я попытался развернуть приложение для внешнего tomcat, я получил ошибку not a managed type
для моего объекта.
Ответ 4
В моем случае проблема была связана с тем, что я забыл аннотировать мои классы Entity с аннотацией @javax.persistence.Entity. Doh!
//The class reported as "not a amanaged type"
@javax.persistence.Entity
public class MyEntityClass extends my.base.EntityClass {
....
}
Ответ 5
Вы можете использовать аннотацию @EntityScan и предоставить пакет сущности для сканирования всех ваших объектов jpa. Вы можете использовать эту аннотацию в своем базовом классе приложения, где вы использовали аннотацию @SpringBootApplication.
например.
@EntityScan ( "com.test.springboot.demo.entity" )
Ответ 6
никогда не забывайте добавлять @Entity в доменный класс
Ответ 7
Если вы скопировали постоянную конфигурацию из другого проекта, вы должны вручную установить пакет в EntityManagerFactory:
@Bean
public EntityManagerFactory entityManagerFactory() throws PropertyVetoException {
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setPackagesToScan("!!!!!!misspelled.package.path.to.entities!!!!!");
....
}
Ответ 8
Вы либо пропустили @Entity в определении класса, либо у вас есть явный путь сканирования компонентов, и этот путь не содержит ваш класс
Ответ 9
Я получил эту ошибку, потому что я тупо написал
public interface FooBarRepository extends CrudRepository Repository, Long> {...
Ответ 10
У меня такая же проблема, в версии spring boot v1.3.x
я сделал обновление spring до версии 1.5.7.RELEASE. Тогда проблема исчезла.
Ответ 11
Ниже работал для меня..
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());
}
}
Ответ 12
У меня была такая же проблема, но только при выполнении тестов с весенней загрузкой, которые требовали 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()
и посмотреть, где это вызывается и какие пакеты передаются ему ,
Ответ 13
Я использую весеннюю загрузку 2.0, и я исправил это, заменив @ComponentScan на @EntityScan
Ответ 14
У меня была эта проблема, потому что я не отобразил все сущности в файле orm.xml