我使用springboot+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连接池,数据源配置如下,
@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 {
WebSecurity配置类,
@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());
}
}
Package 如下:, Application
班级在-
com.nervy.dialer Datasource
班级在- com.nervy.dialer.common
实体类位于- com.nervy.dialer.domain
服务类别在- com.nervy.dialer.domain.service.impl
控制器处于- com.nervy.dialer.spring.controller
存储库类位于-
com.nervy.dialer.spring.jpa.repository WebSecurityConfig
在- com.nervy.dialer.spring.security
谢谢
17条答案
按热度按时间vltsax251#
您可以使用@entityscan注解并提供实体包来扫描所有jpa实体。您可以在使用@springbootapplication注解的基础应用程序类上使用此注解。
e、 g.@entityscan(“com.test.springboot.demo.entity”)
7z5jn7bk2#
从springboot1.3.x迁移到1.5时遇到了一些问题,在entitymanagerfactorybean中更新了实体包之后,它就可以工作了
这个bean在应用程序类中引用如下
dgtucam13#
我已将我的应用程序类移动到父包,如:
主类:com.job.application
实体:com.job.application.entity
这样您就不必添加@entityscan
neekobn84#
别忘了在域类中添加@entity
lb3vh1jj5#
您在类定义中缺少@entity,或者您有显式的组件扫描路径,并且此路径不包含您的类
m1m5dgzv6#
把这个放进你的口袋里
Application.java
文件pw136qt27#
我想更换
@ComponentScan
与@ComponentScan("com.nervy.dialer.domain")
会有用的。编辑:
我添加了一个示例应用程序来演示如何使用bonecp设置池数据源连接。
应用程序的结构与您的相同。我希望这将帮助您解决配置问题
xzlaal3s8#
如果配置了自己的entitymanagerfactory bean,或者从另一个项目复制粘贴了这样的持久性配置,则必须在entitymanagerfactory的配置中设置或调整包:
xfyts7mz9#
在我的例子中,问题是由于我忘记用
@javax.persistence.Entity
注解。哦!1sbrub3j10#
我也有同样的问题,在版本springbootv1.3.x中,我所做的是将springboot升级到版本1.5.7.release。然后问题就消失了。
jyztefdp11#
我使用的是SpringBoot2.0,我将@componentscan替换为
@EntityScan
qqrboqgw12#
我有同样的问题,但只有在运行spring启动测试时才需要jpa。最终的结果是我们自己的jpa测试配置初始化了entitymanagerfactory并将包设置为扫描。如果您手动设置entityscan参数,这显然会覆盖它。
重要的是要注意:如果你仍然卡在你应该设置一个断点在
org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager
上setPackagesToScan()
方法并查看在何处调用它以及向它传递了哪些包。pdkcd3nj13#
我犯这个错误是因为我写得很蠢
公共接口foobarepository扩展了crudepository<foobarrepository,long>{。。。
简要说明:通常创建一个foobarepository类来管理foobar对象(通常在一个名为foo_bar的表中表示数据)。当扩展crudepository来创建专门的存储库类时,需要指定要管理的类型——在本例中是foobar。不过,我打错的是foobarepository而不是foobar。foobarepository不是我试图用foobarepository管理的类型(类)。因此,编译器会发出此错误。
我强调了粗体字的错误之处。删除我的示例中突出显示的word存储库,代码就会编译。
z9zf31ra14#
我遇到这个问题是因为我没有Maporm.xml文件中的所有实体
k97glaaz15#
尝试添加以下所有内容,在我的应用程序中,它与tomcat配合得很好
我使用的是springboot,当我使用嵌入式tomcat时,它可以正常工作
@EntityScan("my.package.base.*")
但当我试图将应用程序部署到外部tomcat时not a managed type
我的实体出错。