若依框架升级SpringBoot3

若依框架升级SpringBoot3

码农世界 2024-05-30 后端 107 次浏览 0个评论

文章目录

  • 前言
  • 一、修改父项目pom.xml
  • 二、修改ruoyi-admin/pom.xml文件mysql依赖
  • 三、修改ruoyi-framework/pom.xml文件
  • 四、修改ruoyi-common/pom.xml文件
  • 五、修改ruoyi-generator/pom.xml文件
  • 六、修改DruidConfig类
  • 七、修改SecurityConfig类
  • 八、Java EE转Jakarta EE
  • 九、解决前端调用了使用@PathVariable接收参数的接口报错的问题
  • 总结

    前言

    若依官网给出的修改步骤,自己在实际操作过程中发现有部分缺失,无法正常启动。在经过网上查阅资料后进行添加可以重启升级。

    注意:先将所有的pom文件修改完成再刷新,否则会出现找不到依赖的错误。如果出现,继续将所有pom文件的内容修改好再刷新。


    一、修改父项目pom.xml

    
    17
    
    
    	org.springframework.boot
    	spring-boot-dependencies
    	3.2.5
    	pom
    	import
    
    
    
        com.alibaba
        druid-spring-boot-3-starter
        1.2.21
    
    
    
    
        javax.xml.bind
        jaxb-api
        2.3.1
    
    
    
        jakarta.servlet
        jakarta.servlet-api
        6.0.0
    
    
    
        com.baomidou
        mybatis-plus-boot-starter
        3.5.5
    
    
    
        com.mysql
        mysql-connector-j
        8.1.0
    
    

    二、修改ruoyi-admin/pom.xml文件mysql依赖

    
    
    	com.mysql
    	mysql-connector-j
    
    

    三、修改ruoyi-framework/pom.xml文件

    
    
    	pro.fessional
    	kaptcha
    	
    		
    			servlet-api
    			jakarta.servlet
    		
    	
    
    
    
        com.alibaba
        druid-spring-boot-3-starter
    
    

    四、修改ruoyi-common/pom.xml文件

    
    
    	jakarta.servlet
    	jakarta.servlet-api
    
    
    
        com.baomidou
        mybatis-plus-boot-starter
    
    
    
        org.mybatis
        mybatis-spring
        3.0.3
    
    

    五、修改ruoyi-generator/pom.xml文件

    
    
        com.alibaba
        druid-spring-boot-3-starter
    
    

    六、修改DruidConfig类

    将引入的Druid改为boot3

    import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceBuilder;
    import com.alibaba.druid.spring.boot3.autoconfigure.properties.DruidStatProperties;
    

    七、修改SecurityConfig类

    package com.ruoyi.framework.config;
    import com.ruoyi.framework.config.properties.PermitAllUrlProperties;
    import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter;
    import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl;
    import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.HttpMethod;
    import org.springframework.security.authentication.AuthenticationManager;
    import org.springframework.security.authentication.ProviderManager;
    import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
    import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
    import org.springframework.security.config.annotation.web.configurers.HeadersConfigurer;
    import org.springframework.security.config.http.SessionCreationPolicy;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.web.SecurityFilterChain;
    import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
    import org.springframework.security.web.authentication.logout.LogoutFilter;
    import org.springframework.web.filter.CorsFilter;
    /**
     * spring security配置
     *
     * @author ruoyi
     */
    @EnableMethodSecurity(securedEnabled = true)
    @Configuration
    public class SecurityConfig {
        /**
         * 自定义用户认证逻辑
         */
        @Autowired
        private UserDetailsService userDetailsService;
        /**
         * 认证失败处理类
         */
        @Autowired
        private AuthenticationEntryPointImpl unauthorizedHandler;
        /**
         * 退出处理类
         */
        @Autowired
        private LogoutSuccessHandlerImpl logoutSuccessHandler;
        /**
         * token认证过滤器
         */
        @Autowired
        private JwtAuthenticationTokenFilter authenticationTokenFilter;
        /**
         * 跨域过滤器
         */
        @Autowired
        private CorsFilter corsFilter;
        /**
         * 允许匿名访问的地址
         */
        @Autowired
        private PermitAllUrlProperties permitAllUrl;
        /**
         * @return
         * @throws Exception
         */
        @Bean
        AuthenticationManager authenticationManager() {
            DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
            // 身份认证接口
            daoAuthenticationProvider.setUserDetailsService(userDetailsService);
            daoAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder());
            return new ProviderManager(daoAuthenticationProvider);
        }
        /**
         * anyRequest | 匹配所有请求路径
         * access | SpringEl表达式结果为true时可以访问
         * anonymous | 匿名可以访问
         * denyAll | 用户不能访问
         * fullyAuthenticated | 用户完全认证可以访问(非remember-me下自动登录)
         * hasAnyAuthority | 如果有参数,参数表示权限,则其中任何一个权限可以访问
         * hasAnyRole | 如果有参数,参数表示角色,则其中任何一个角色可以访问
         * hasAuthority | 如果有参数,参数表示权限,则其权限可以访问
         * hasIpAddress | 如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问
         * hasRole | 如果有参数,参数表示角色,则其角色可以访问
         * permitAll | 用户可以任意访问
         * rememberMe | 允许通过remember-me登录的用户访问
         * authenticated | 用户登录后可访问
         */
        @Bean
        SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
            return httpSecurity
                    // CSRF禁用,因为不使用session
                    .csrf(AbstractHttpConfigurer::disable)
                    // 禁用HTTP响应标头
                    .headers(header -> header.cacheControl(HeadersConfigurer.CacheControlConfig::disable).frameOptions(HeadersConfigurer.FrameOptionsConfig::disable))
                    // 认证失败处理类
                    .exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler))
                    // 基于token,所以不需要session
                    .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                    // 注解标记允许匿名访问的url
                    .authorizeHttpRequests((requests) -> {
                        permitAllUrl.getUrls().forEach(url -> requests.requestMatchers(url).permitAll());
                        // 对于登录login 注册register 验证码captchaImage 允许匿名访问
                        requests.requestMatchers("/login", "/register", "/captchaImage").permitAll()
                                // 静态资源,可匿名访问
                                .requestMatchers(HttpMethod.GET, "/", "/*.html", "/**.html", "/**.css", "/**.js", "/profile/**").permitAll()
                                .requestMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/*/api-docs/**", "/druid/**").permitAll()
                                // 除上面外的所有请求全部需要鉴权认证
                                .anyRequest().authenticated();
                    })
                    // 添加Logout filter
                    .logout(logout -> logout.logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler))
                    // 添加JWT filter
                    .addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
                    // 添加CORS filter
                    .addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class)
                    .addFilterBefore(corsFilter, LogoutFilter.class).build();
        }
        /**
         * 强散列哈希加密实现
         */
        @Bean
        public BCryptPasswordEncoder bCryptPasswordEncoder() {
            return new BCryptPasswordEncoder();
        }
    }
    

    八、Java EE转Jakarta EE

    Spring Boot 3.0将所有底层依赖项从Java EE迁移到了Jakarta EE,会对一些使用了Java EE的方法造成影响,需要进行相应的修改和调整

    javax.annotation 替换成 jakarta.validation
    javax.servlet    替换成 jakarta.servlet
    javax.validation 替换成 jakarta.validation
    #代码生成模板controller.java.vm也需要换一下javax为jakarta
    

    九、解决前端调用了使用@PathVariable接收参数的接口报错的问题

    java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the ‘-parameters’ flag.

    解决办法:指定接收参数名,如@PathVariable(“dictType”)或者@PathVariable(name = “dictType”)

    // 调用这个接口会报错
    @GetMapping(value = "/type/{dictType}")
    public AjaxResult dictType(@PathVariable String dictType)
    {
        List data = dictTypeService.selectDictDataByType(dictType);
        if (StringUtils.isNull(data))
        {
            data = new ArrayList();
        }
        return success(data);
    }
    // 修改之后
    @GetMapping(value = "/type/{dictType}")
    public AjaxResult dictType(@PathVariable("dictType") String dictType)
    {
        List data = dictTypeService.selectDictDataByType(dictType);
        if (StringUtils.isNull(data))
        {
            data = new ArrayList();
        }
        return success(data);
    }
    

    总结

转载请注明来自码农世界,本文标题:《若依框架升级SpringBoot3》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,107人围观)参与讨论

还没有评论,来说两句吧...

Top