PAS部署:业务应用部署报错:No qualifying bean of type ‘javax.persistence.EntityManagerFactory‘ available

【问题描述】

[PAS6.5 业务应用部署报错:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'javax.persistence.EntityManagerFactory' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:660)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1413)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524)

【问题原因】

应用引用的activiti-spring-boot-starter-basic-6.0.0.jar的org.activiti.spring.boot.JpaProcessEngineAutoConfiguration类的@ConditionalOnClass(name= "javax.persistence.EntityManagerFactory"),根据javax.persistence.EntityManagerFactory类去创建bean,和javax.persistence中的冲突了 

【解决方案】

项目里参考https://www.cnblogs.com/jiangwz/p/9758742.html中的方法,引入了activiti-spring-boot-starter-jpa的jar。

引入了jpa的jar后,报了如下新异常java.lang.NoSuchMethodError: org.apache.ibatis.session.Configuration.getLanguageDriver(Ljava/lang/Class;)Lorg/apache/ibatis/scripting/LanguageDriver,这个异常是因为项目里存在org.apache.ibatis.session的jar冲突,解决了这个冲突后,应用部署不报错了。

【原文链接】

http://doc.primeton.com/pages/viewpage.action?pageId=61930342

### 关于 `No qualifying bean of type 'org.apache.shiro.mgt.SecurityManager'` 的解决方案 当遇到 `No qualifying bean of type 'org.apache.shiro.mgt.SecurityManager' available` 这一错误时,表明 Spring 容器未能成功加载 Shiro 的核心管理对象 SecurityManager。以下是可能的原因以及对应的解决方法: #### 原因分析 1. **缺少 SecurityManager 配置** 如果未显式定义 SecurityManager 或者其相关实现类,则 Spring 将无法创建该类型的 Bean[^1]。 2. **依赖注入失败** 可能由于某些原因导致 SecurityManager 所需的其他依赖项(如 Realm)未被正确定义或初始化[^3]。 3. **配置文件问题** 若 application.properties 文件中的配置不完整或有误,可能导致容器扫描不到必要的组件[^1]。 --- #### 解决方案 ##### 方法 1: 显式声明 SecurityManager Bean 通过 Java Config 方式手动注册 SecurityManager Bean 并指定其实现类 DefaultWebSecurityManager。代码如下所示: ```java import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ShiroConfig { @Bean public DefaultWebSecurityManager securityManager() { DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); // 设置自定义Realm (如果有的话) manager.setRealm(myCustomRealm()); return manager; } @Bean public MyCustomRealm myCustomRealm() { return new MyCustomRealm(); // 替换为实际使用的Realm类名 } } ``` 上述代码片段中,`DefaultWebSecurityManager` 被设置为其默认实现,并绑定了一个自定义 Realm 实例[^3]。 ##### 方法 2: 使用 XML 配置方式 对于偏好基于 XML 的项目结构,可以采用以下形式来定义 SecurityManager 和关联的 Filter 工厂: ```xml <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="myCustomRealm"/> </bean> <!-- 自定义Realm --> <bean id="myCustomRealm" class="com.example.MyCustomRealm"/> <!-- Shiro过滤器工厂 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <!-- 其他属性省略... --> </bean> ``` 此部分同样强调了 SecurityManager 对象及其所依赖的 Realm 组件之间的关系建立过程[^2]。 ##### 方法 3: 检查 ComponentScan 是否覆盖到相关包路径 确保项目的主应用程序启动类上标注了正确的扫描范围,例如: ```java @SpringBootApplication(scanBasePackages = {"com.example"}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这里假设所有的业务逻辑和服务层都位于 com.example 下面;如果不是,请调整 scanBasePackages 参数以匹配实际情况[^1]。 --- ### 总结 以上三种途径均可有效应对 “No qualifying bean of type ‘org.apache.shiro.mgt.SecurityManager’” 报错情况的发生。推荐优先考虑 Method 1 即纯注解驱动的方式构建应用环境,因其更贴合现代开发趋势并具备较高的可读性和维护便利度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值