谷粒商城项目遇到的问题汇总

本文总结了谷粒商城项目开发中遇到的技术问题,包括@Cacheable注解不生效、Mybatis映射文件调用内部类错误、Thymeleaf注释后仍报错、xxl-sso集成问题、Java8 Lambda表达式变量报错、Feign接口调用异常、远程调用丢失请求头、RabbitMQ Bean实例创建问题,以及Seata批量插入错误和Thymeleaf模板文件找不到。通过分析和解决这些问题,加深了对Spring、Mybatis、Thymeleaf等技术的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2022年9月学习记录

一、@Cacheable注解不生效问题——2022-07-29

1、遇到的两种@Cacheable修饰的方法缓存没有生效的情况

(1)直接通过new创建@Cacheable注解修饰方法所在的类

  • @Cacheable方法所在的类必须交由Spring管理,可通过注解@Conponent修饰类,给调用该缓存方法的类添加@ComponentScan注解以便能扫描到。此外也可以通过其他方法让Spring管理该类。

(2)方法A调同一个类里的另一个有缓存注解的方法B,这样是不走缓存的。

  1. 不使用注解的方式,直接取 Ehcache 的 CacheManger 对象,把需要缓存的数据放到里面,类似于使用 Map,缓存的逻辑自己控制;或者不使用@Cacheable直接使用redis的缓存方式去添加缓存;
  2. 把方法A和方法B放到两个不同的类里面;
2、@Cacheable 的一些注意点
  1. 因为@Cacheable 由AOP 实现,所以,如果该方法被其它注解切入,当缓存命中的时候,则其它注解不能正常切入并执行,@Before 也不行,当缓存没有命中的时候,其它注解可以正常工作
  2. 因为@Cacheable 是使用AOP 代理实现的 ,通过创建内部类来代理缓存方法,这样就会导致一个问题,类内部的方法调用类内部的缓存方法不会走代理,不会走代理,就不能正常创建缓存,所以每次都需要去调用数据库。

二、Mybatis映射文件 *DAO.xml中调用内部类——2022-08-06

调用内部类提示找不到

假如B是A的内部类,在*DAO.xml文件中调用类B时,需写成com.XXX.A$B , 注意A类和B类之间用$表示内外关系,而不是常用的.点号。

错误写法
使用.调用内部类
正确写法
使用$调用内部类

三、在thymeleaf解析的html中将错误代码注释后还是报错——2022-08-08

1、问题描述

如代码[[${val.attrValue}]]因为有解析错误等问题需要暂时注释掉,但是加上注释后<!-- [[${val.attrValue}]]-->后发现val.attrValue还是能够被thymeleaf解析

2、原因分析

测试如下代码,其中hasStock的值为boolean类型

<!--[[${item.hasStock}]]-->                
<!--${item.hasStock}-->
[[${item.hasStock}]]

经thmeleaf的解析结果如下,可以看到<!-- -->内的有[[ ]]符号修饰的SPEL表达式是正常解析了的:

<!--false-->
<!--${item.hasStock}-->
false
3、小结

[[ ]]之间的表达式在Thymeleaf中被认为是内联表达式,在其中使用任何类型的表达式都会有效,即无论怎样都会被解析,甚至加上注释符号<!-- -->都能解析,所有对类似于<!-- [[${val.attrValue}]]-->的代码注释时,需要去掉[[ ]],写成<!-- ${val.attrValue}-->;否则如果想将有解析错误的代码注释后仍然会报解析错误。

四、导入xxl-sso项目的标签内的爆红——2022-08-16

1、解决方法

爆红是因为<pofiles>标签下的<plugins>插件无法下载,把<plugins>复制到与<pofiles>标签同层的<build>标签内就可以正常下载插件了,下载完后可以删除外层<build>标签下的<plugins>,<pofiles>标签下的<plugins>插件不会再爆红。(注意:<plugins>标签是<build>标签的子标签

2、疑惑点

目前对pom.xml下的<pofiles>标签理解不深,只是简单了解<pofiles>标签主要用于多环境部署,用<pofile>下的<id>属性来标识不同开发生产环境。按<pofiles>标签的职能来说idea应该会下载<pofiles>下的<plugins>资源啊!毕竟<dependencies>依赖能正常下载

3、SpringBoot使用profiles实现多环境配置

1.maven配置
配置maven中的 profiles 属性,分为开发环境 dev、生产环境 prod 以及测试环境 test

<profiles>
    <profile>
        <id>test</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <properties>
            <environment>test</environment>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <activation>
            <activeByDefault>false</activeByDefault>
        </activation>
        <properties>
            <environment>prod</environment>
        </properties>
    </profile>
    <profile>
        <id>dev</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties
### RabbitMQ 在谷粒商城项目的实现与用法 #### 一、RabbitMQ 的基本配置 在谷粒商城项目中,RabbitMQ 是作为消息中间件被引入的。其核心功能在于通过异步通信机制提升系统的性能可靠性。以下是关于 RabbitMQ 配置的一些关键点: 1. **插件启用** 安装完成后,需启动管理插件以便于监控操作 RabbitMQ 实例。具体命令如下: ```bash rabbitmq-plugins.bat enable rabbitmq_management ``` 此命令用于激活 RabbitMQ 的 Web 管理界面[^1]。 2. **Spring Boot 集成配置** 谷粒商城项目基于 Spring Boot 构建,在 `application.yml` 或 `application.properties` 文件中需要对 RabbitMQ 进行必要的配置。例如手动确认模式可以通过以下方式设置: ```yaml spring: rabbitmq: listener: simple: acknowledge-mode: manual ``` 手动确认模式允许消费者显式通知 RabbitMQ 已成功处理某条消息,从而提高消息传递的可靠性[^3][^4]。 #### 二、RabbitMQ 的工作原理 RabbitMQ 基于 AMQP 协议运行,支持多种消息传递模型,包括发布/订阅、路由主题交换等。以下是其主要组件及其作用: 1. **队列 (Queue)** 队列是 RabbitMQ 中的核心数据结构之一,负责存储待处理的消息。它具有高可用性持久化能力,能够应对突发流量并保障消息丢失[^5]。 2. **交换器 (Exchange)** Exchange 接收来自生产者的消息并将这些消息转发至绑定的一个或多个队列。常见的交换类型有 Direct、Fanout Topic。 3. **绑定关系 (Binding)** 绑定定义了某个特定队列如何连接到指定的 exchange 上。这种灵活的设计使得复杂的业务逻辑得以轻松实现。 #### 三、实际应用场景分析 在谷粒商城的具体场景下,RabbitMQ 主要应用于以下几个方面: 1. **订单创建后的延迟支付提醒** 当用户下单后未及时完成付款时,系统会利用 RabbitMQ 设置一定时间间隔后再向客户推送提示信息。此过程涉及 TTL(Time To Live)队列以及死信队列的功能运用。 2. **秒杀活动中的库存扣减优化** 秒杀模块通常面临极高并发请求压力,借助 RabbitMQ 可有效缓解数据库写入瓶颈问题。先将用户的抢购行为记录进队列再逐步同步更新商品数量状态,既保证交易公平又提升了整体吞吐量。 3. **分布式事务解决方案** 对于跨服务间的数据一致性维护难题,采用 TCC(Try Confirm Cancel)或者最终一致性的策略配合 RabbitMQ 来达成目的。比如退款流程里可能涉及到账户余额调整等多个关联动作,则可通过消息驱动的方式来协调各环节顺利完成整个链条的操作。 ```java // 示例代码片段展示如何声明一个简单的队列 @Autowired private AmqpAdmin amqpAdmin; public void createQueue() { Queue queue = new Queue("test.queue", true); amqpAdmin.declareQueue(queue); } ``` 以上便是围绕 RabbitMQ 在谷粒商城项目里的部分实践总结说明。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值