若依报:Could not resolve placeholder ‘shiro.session.expireTime‘ in value “${shiro.session.expireTime}“

解决SpringBootShiro配置异常及Maven子模块打包问题
文章讲述了在SpringBoot应用中遇到的Shiro配置异常,具体为BeanCreationException,原因是配置文件中的shiro.session.expireTime占位符未正确解析。问题源于创建子模块后,Maven默认打包方式变为pom,导致静态资源未被编译进target目录。解决方案是将子模块的packaging由pom改为jar,确保静态资源被正确打包。

1、异常描述:

Error creating bean with name 'shiroFilterFactoryBean' defined in class path resource [com/ruoyi/framework/config/ShiroConfig.class]

org.springframework.beans.factory.BeanCreationException: 
    Error creating bean with name 'shiroCasConfig': 
        Injection of autowired dependencies failed; 
    nested exception is java.lang.IllegalArgumentException:
        Could not resolve placeholder 'shiro.session.expireTime' in value "${shiro.session.expireTime}"

2、问题原因:

建立新的子模块后,会将maven中原来的jar打包方式自动改为pom打包,在删除的时候没有删除干净。

pom模式的打包方式不会将静态资源一并被编译进target中,所以会报找不到静态文件的问题。

 3、解决方法:

将maven中的<packaging>pom</packaging>改为<packaging>jar</packaging>

4、该异常产生原因一般会有3种情况:

  • 常见的就是配置文件有问题,比如说yml或properties文件配置有问题。
  • 引入的依赖有问题
  • 环境方面问题,比如说jdk不一致或是idea中的iml文件的问题
  • 错误新建子模块后没有删除干净被修改的地方

### 关于 `jeecg.shiro.excludeUrls` 占位符解析失败的原因分析 在Spring Boot项目中遇到`java.lang.IllegalArgumentException: Could not resolve placeholder 'jeecg.shiro.excludeUrls' in value "${jeecg.shiro.excludeUrls}"`错误通常意味着配置文件未能正确加载或指定路径下的`.properties`文件未被识别。 #### 可能原因及解决方案 - **通配符使用不当** 当使用通配符来匹配多个属性文件时,可能会因为某些特定条件下无法找到确切的目标文件而引发此问题。例如,在XML配置中定义如下: ```xml <bean id="propertyConfig" class="com.company.module.PropertyHolder"> <property name="locations"> <list> <value>classpath:*.properties</value> </list> </property> </bean> ``` 这种方式可能导致预期之外的行为,特别是当类路径下存在大量不同名称的`.properties`文件时[^1]。 - **重复声明 PropertyPlaceholderConfigurer Bean** 如果在同一应用上下文中多次声明了`PropertyPlaceholderConfigurer`类型的Bean,则只有第一个会被实际处理并生效,其余均会被忽略。这可能造成后续尝试访问其他位置定义的变量时发生解析错误。因此建议保持此类组件单一实例化原则[^2]。 - **环境差异引起的问题** 对于部署至生产环境中运行的应用程序而言,如果本地开发环境下一切正常但在目标服务器上却抛出了上述异常,那么很可能是由于打包过程中所使用的profile设置不一致或是上传后的资源文件丢失造成的。确保所有必要的配置文件都已随同jar包一同发布,并且能够在运行时刻由JVM成功定位到它们的位置[^4]。 #### 实践建议与代码示例 为了防止因通配符带来的不确定性以及简化维护成本,推荐将涉及相同业务逻辑的相关参数集中存放在同一个`.properties`文件内;对于跨模块共享的数据则可以考虑创建独立的基础配置文件供各子系统引用。以下是调整后的YAML格式配置样例(适用于Spring Boot): ```yaml server: port: 8080 spring: profiles: active: dev shiro: excludeUrls: /login,/logout,/public/** # 更多配置项... ``` 另外一种方法是在Java代码层面通过编程的方式动态注册外部化的Properties对象,从而绕过静态资源配置所带来的局限性: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; @Configuration public class AppConfig { @Bean public static PropertySourcesPlaceholderConfigurer propertyConfigurer() { final PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer(); List<Resource> resourceList = Arrays.asList( new ClassPathResource("application.properties"), new FileSystemResource("/etc/myapp/config/custom.properties") // 或者任何合法的文件系统路径 ); configurer.setLocations(resourceList.toArray(new Resource[]{})); return configurer; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值