Spring 动态代理引发的问题.

  • @Transactional 注解事务
    发生异常事务回滚:
@Override
    @Transactional
    public boolean insertEmployee(EmployeeTo employeeTo) {
        employeeMapper.insert(employeeTo);
        try {
            updateEmployee(employeeTo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

    @Override
    @Transactional
    public boolean updateEmployee(EmployeeTo employeeTo) {
        employeeMapper.updateById(employeeTo);
        throw new MyException("更新操作失败");
        // return true;
    }

此处发生异常:新增用户还是会插入到数据库中,虽然,更新操作抛出了异常,但是还是会更新,事务不会回滚,此时的注解事务是失效的。还是回更新用户的数据。类似的注解像是异步任务注解@async 。为了不影响线程的执行,采用异步任务。
在这里插入图片描述


  • Spring 解决方案
    Spring 配置文件 XML 新增如下语句, 先开启cglib 代理, exposeProxy = true 暴露代理对象。
<aop:aspectj-autoproxy expose-proxy ="true" />
//或者
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)

使用AopContext 获取当前对象的动态代理。
AopContext.currentProxy()

主类开启cglib代理:
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
-----------------------------------------
@Override
    @Transactional
    public boolean insertEmployee(EmployeeTo employeeTo) {
        employeeMapper.insert(employeeTo);
        try {
            EmployeeService context = (EmployeeService)AopContext.currentProxy();
            context.updateEmployee(employeeTo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

    @Override
    @Transactional
    public boolean updateEmployee(EmployeeTo employeeTo) {
        employeeTo.setEmail("mail");
        employeeMapper.updateById(employeeTo);
        throw new MyException("更新操作失败");
        // return true;
    }

在这里插入图片描述
通过获取代理对象去实现增强。来实现事务,回滚。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.WebServerException` 这种异常通常发生在使用 Spring Boot 框架启动应用时,特别是涉及到 Web 服务器配置的地方。 Spring Boot 的核心是 `ApplicationContext`,它是整个应用上下文的根容器,管理着应用的所有bean实例化、依赖注入以及生命周期管理。当尝试启动包含 Web 服务的 Bean(如 Tomcat 或嵌入式 Jetty 等)时,如果发生错误,则会抛出上述异常。 ### 异常原因及解决方案: #### 1. **配置错误** - **原因**:Web 服务器相关的配置可能存在语法错误或者配置项未正确设置。 - **解决办法**: - 检查 `application.properties` 或 `application.yml` 配置文件中关于 web 服务器的部分,比如端口号是否正确、连接池大小等配置。 - 确保所有依赖库版本兼容,并且正确声明了对应的依赖(例如,对于使用的是 Tomcat,则需要添加相应的依赖)。 #### 2. **依赖冲突** - **原因**:项目中可能存在与其他库的版本冲突,尤其是与 Web 服务器相关的库之间存在版本不兼容的情况。 - **解决办法**: - 使用 `dependencyManagement` 在 `pom.xml` 中管理所有的 Maven 依赖库版本。 - 核实并排除可能导致版本冲突的库依赖。 #### 3. **资源不足** - **原因**:操作系统资源(如内存、CPU)不足,无法满足启动 Web 应用的需求。 - **解决办法**: - 扩大系统资源限制(取决于运行环境,可能包括增加物理服务器资源或调整 JVM 参数)。 #### 4. **网络问题** - **原因**:网络配置问题导致无法访问外部资源或者 HTTP 代理配置不当。 - **解决办法**: - 检查应用的网络连接状态和防火墙规则。 - 如果使用了 HTTP 代理,请正确配置代理信息。 #### 5. **编码或字符集问题** - **原因**:输入输出操作处理不当时,可能出现字符集转换错误。 - **解决办法**: - 确保所有字符串操作都使用正确的字符集编码。 - 对于国际化应用,检查资源文件和本地化字符串的编码一致性。 ### 相关问题: 1. 如何排查 Spring Boot 应用中的配置错误? 2. Spring Boot 中如何解决依赖冲突问题? 3. 当遇到资源不足错误时,应该如何优化部署环境? 通过以上步骤和建议,通常可以定位并解决由 `ApplicationContextException` 引发问题。记得在每次修改配置或代码后,都需要重新构建并测试应用,确保问题得到修复并且没有引入新的问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值