美文网首页
SpirngMVC框架转SpringBoot

SpirngMVC框架转SpringBoot

作者: zain丶月下 | 来源:发表于2020-03-15 11:10 被阅读0次

    在这篇文章中,主要介绍Springmvc框架转成SpirngBoot框架的用例,如果有需要了解什么是SpringBoot,或者一些其他springBoot的基础知识的。不在这篇文章的范畴。话不多说,进入正题。
    在转框架之前,一定要搭建好SpringBoot项目需要的环境和框架(百度一大堆),在mvc项目的pom文件中,把boot文件中已经引入的依赖删除。拷贝剩下的依赖到boot文件的pom中。在pom中我们可以看到很多文件的版本号会冲突,这是由于boot中自己携带了很多的jar包。我们需要做的就是删除版本号。保持和boot中jar包的版本一致即可。完成后可以和下面一样

    <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-classic</artifactId>
            </dependency>
            <!-- Servlet web -->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
            </dependency>
            <!-- json解析 -->
            <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
            </dependency>
            <!-- Map工具类 对标准java Collection的扩展 spring-core.jar需commons-collections.jar -->
            <dependency>
                <groupId>commons-collections</groupId>
                <artifactId>commons-collections</artifactId>
                <version>3.2.2</version>
            </dependency>
            <!-- 数据库 -->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <dependency>
                <groupId>com.mchange</groupId>
                <artifactId>c3p0</artifactId>
                <version>0.9.5.4</version>
            </dependency>
            <!-- 图片处理 -->
            <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
            <dependency>
                <groupId>net.coobird</groupId>
                <artifactId>thumbnailator</artifactId>
                <version>0.4.8</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.github.penggle/kaptcha -->
            <dependency>
                <groupId>com.github.penggle</groupId>
                <artifactId>kaptcha</artifactId>
                <version>2.3.2</version>
            </dependency>
            <!-- 文件上传  -->
            <dependency>
                <groupId>commons-fileupload</groupId>
                <artifactId>commons-fileupload</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!-- redis客户端:Jedis -->
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.aspectj</groupId>
                <artifactId>aspectjweaver</artifactId>
            </dependency>
            <!-- 创建项目中自带包 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>2.1.0</version>
            </dependency> 
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <!-- 二维码相关 -->
            <!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
            <dependency>
                <groupId>com.google.zxing</groupId>
                <artifactId>javase</artifactId>
                <version>3.3.0</version>
            </dependency>
            <!--  百度短链接 -->
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
            </dependency>
            <!--  定时任务 -->
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz</artifactId>
                <version>2.3.0</version>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context-support</artifactId>
            </dependency>
    

    把需要用到的数据复制到application.properties中

    #database
    #jdbc.driver=com.mysql.jdbc.Driver
    jdbc.driver=com.mysql.cj.jdbc.Driver
    jdbc.url=jdbc:mysql://****:3306/o2o?useUnicode=true&characterEncoding=utf8&useSSL=false
    jdbc.username=WnplV/ietfQ=
    jdbc.password=f8aOxpIcBkHTBpXDEsTM2Q==
    
    #mybatis
    mybatis_config_file=mybatis-config.xml
    mapper_path=/mapper/**.xml
    type_alias_package=com.tzf.o2o.entity
    
    #redis
    redis.hostname=****
    redis.port=6379
    redis.database=0
    redis.pool.maxActive=100
    redis.pool.maxIdle=20
    redis.pool.maxWait=3000
    redis.pool.testOnBorrow=true
    

    接下来再转移mvc中的dao.xml文件。
    mvc 中dao.xml中的dataSource文件

        <!-- 2.数据库连接池 -->
        <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
            <!-- 配置连接池属性 -->
            <property name="driverClass" value="${jdbc.driver}" />
            <property name="jdbcUrl" value="${jdbc.url}" />
            <property name="user" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            
            <!-- c3p0连接池的私有属性 -->
            <property name="maxPoolSize" value="30" />
            <property name="minPoolSize" value="10" />
            <!-- 关闭连接后不自动commit -->
            <property name="autoCommitOnClose" value="false" />
            <!-- 获取连接超时时间 -->
            <property name="checkoutTimeout" value="10000" />
            <!-- 当获取连接失败重试次数 -->
            <property name="acquireRetryAttempts" value="2" />
        </bean>
    

    boot中的写法

    
    @Configuration
    @MapperScan("com.tzf.o2o.dao")
    public class DataSourceConfiguration {
        @Value("${jdbc.driver}")
        private String jdbcDriver;
        @Value("${jdbc.url}")
        private String jdbcUrl;
        @Value("${jdbc.username}")
        private String jdbcUsername;
        @Value("${jdbc.password}")
        private String jdbcPassword;
    
        /**
         * 生成与spring-dao.xml对应的bean dataSource
         * 
         * @return
         * @throws PropertyVetoException
         */
        @Bean(name = "dataSource")
        public ComboPooledDataSource createDataSource() throws PropertyVetoException {
            // 生成datasource实例
            ComboPooledDataSource dataSource = new ComboPooledDataSource();
            // 跟配置文件一样设置以下信息
            // 驱动
            dataSource.setDriverClass(jdbcDriver);
            // 数据库连接URL
            dataSource.setJdbcUrl(jdbcUrl);
            // 设置用户名
            dataSource.setUser(DESUtil.getDecryptString(jdbcUsername));
            // 设置用户密码
            dataSource.setPassword(DESUtil.getDecryptString(jdbcPassword));
            // 配置c3p0连接池的私有属性
            // 连接池最大线程数
            dataSource.setMaxPoolSize(30);
            // 连接池最小线程数
            dataSource.setMinPoolSize(10);
            dataSource.setInitialPoolSize(10);
            // 关闭连接后不自动commit
            dataSource.setAutoCommitOnClose(false);
            // 连接超时时间
            dataSource.setCheckoutTimeout(10000);
            // 连接失败重试次数
            dataSource.setAcquireRetryAttempts(2);
            return dataSource;
        }
    }
    

    在这里需要注意的是
    @Mapper 注解针对的是一个一个的类,相当于是一个一个 Mapper.xml 文件。而一个接口一个接口的使用 @Mapper,太麻烦了,于是 @MapperScan 就应用而生了。@MapperScan 配置一个或多个包路径,自动的扫描这些包路径下的类,自动的为它们生成代理类。
    当使用了 @MapperScan 注解,将会生成 MapperFactoryBean, 如果没有标注 @MapperScan 也就是没有 MapperFactoryBean 的实例。 @Import 里面的配置,具体可以在 AutoConfiguredMapperScannerRegistrar 和 MybatisAutoConfiguration 类中查看源代码进行分析。
    dao.xml中的文件

    <!-- 3.配置SqlSessionFactory对象 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 注入数据库连接池 -->
            <property name="dataSource" ref="dataSource" />
            <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
            <property name="configLocation" value="classpath:mybatis-config.xml" />
            <!-- 扫描entity包 使用别名      这里一定要注意-->
            <property name="typeAliasesPackage" value="com.tzf.o2o.entity" />
            <!-- 扫描sql配置文件:mapper需要的xml文件 -->
            <property name="mapperLocations" value="classpath:mapper/*.xml" />
        </bean>
    

    在boot中的使用

    @Configuration
    public class SessionFactoryConfiguration {
        // mybatis-config.xml配置文件的路径
        private static String mybatisConfigFile;
    
        @Value("${mybatis_config_file}")
        public void setMybatisConfigFile(String mybatisConfigFile) {
            SessionFactoryConfiguration.mybatisConfigFile = mybatisConfigFile;
        }
    
        // mybatis mapper文件所在路径
        private static String mapperPath;
    
        @Value("${mapper_path}")
        public void setMapperPath(String mapperPath) {
            SessionFactoryConfiguration.mapperPath = mapperPath;
        }
    
        // 实体类所在的package
        @Value("${type_alias_package}")
        private String typeAliasPackage;
    
        @Autowired
        private DataSource dataSource;
    
        /**
         * 创建sqlSessionFactoryBean 实例 并且设置configtion 设置mapper 映射路径 设置datasource数据源
         * 
         * @return
         * @throws IOException
         */
        @Bean(name = "sqlSessionFactory")
        public SqlSessionFactoryBean createSqlSessionFactoryBean() throws IOException {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            // 设置mybatis configuration 扫描路径
            sqlSessionFactoryBean.setConfigLocation(new ClassPathResource(mybatisConfigFile));
            // 添加mapper 扫描路径
            PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
            String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + mapperPath;
            sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources(packageSearchPath));
            // 设置dataSource
            sqlSessionFactoryBean.setDataSource(dataSource);
            // 设置typeAlias 包扫描路径
            sqlSessionFactoryBean.setTypeAliasesPackage(typeAliasPackage);
            return sqlSessionFactoryBean;
        }
    

    把xml中的文件转移过来后,我们接下来就是很正常的转移entity,dao层和之前编写的一些mapper文件拷贝到boot中即可。
    接下来是service.xml的转移

    <!-- 配置事务管理器 -->
        <bean id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!-- 注入数据库连接池 -->
            <property name="dataSource" ref="dataSource" />
        </bean>
    
        <!-- 配置基于注解的声明式事务 -->
        <tx:annotation-driven
            transaction-manager="transactionManager" />
    

    boot中同样的创建一个类

    @Configuration
    //首先使用注解 @EnableTransactionManagement 开启事务支持后
    //在Service方法上添加注解 @Transactional 便可
    @EnableTransactionManagement
    public class TransactionManagementConfiguration implements TransactionManagementConfigurer{
    
        @Autowired
        private DataSource dataSource;
        
        /**
         * 关于事务管理,需要返回PlatformTransactionManager的实现
         */
        @Override
        public PlatformTransactionManager annotationDrivenTransactionManager() {
            return new DataSourceTransactionManager(dataSource);
        }
    
    }
    

    在这里需要注意的是,开启事务在这里要继承一个TransactionManagementConfigurer类即可。实现里面的方法。
    写下来转移mvc中的redis文件配置信息
    首先把redis的工具类拷贝到boot中,
    先给大家看一下redis.xml文件

    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
            <!-- 控制一个pool可分配多少个jedis实例 -->
            <property name="maxTotal" value="${redis.pool.maxActive}" />
            <!-- 连接池中最多可空闲maxIdle个连接 ,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的连接,而不被清除,随时处于待命状态。 -->
            <property name="maxIdle" value="${redis.pool.maxIdle}" />
            <!-- 最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常 -->
            <property name="maxWaitMillis" value="${redis.pool.maxWait}" />
            <!-- 在获取连接的时候检查有效性 -->
            <property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
        </bean>
    
        <!-- 创建Redis连接池,并做相关配置 -->
        <bean id="jedisWritePool" class="com.tzf.o2o.cache.JedisPoolWriper"
            depends-on="jedisPoolConfig">
            <constructor-arg index="0" ref="jedisPoolConfig" />
            <constructor-arg index="1" value="${redis.hostname}" />
            <constructor-arg index="2" value="${redis.port}" type="int" />
        </bean>
    
        <!-- 创建Redis工具类,封装好Redis的连接以进行相关的操作 -->
        <bean id="jedisUtil" class="com.tzf.o2o.cache.JedisUtil" scope="singleton">
            <property name="jedisPool">
                <ref bean="jedisWritePool" />
            </property>
        </bean>
        <!-- Redis的key操作 -->
        <bean id="jedisKeys" class="com.tzf.o2o.cache.JedisUtil$Keys"
            scope="singleton">
            <constructor-arg ref="jedisUtil"></constructor-arg>
        </bean>
        <!-- Redis的Strings操作 -->
        <bean id="jedisStrings" class="com.tzf.o2o.cache.JedisUtil$Strings"
            scope="singleton">
            <constructor-arg ref="jedisUtil"></constructor-arg>
        </bean>
    

    在boot中创建redis配置文件

    
    @Configuration
    public class RedisConfiguration {
        @Value("${redis.hostname}")
        private String hostname;
        @Value("${redis.port}")
        private int port;
        @Value("${redis.pool.maxActive}")
        private int maxTotal;
        @Value("${redis.pool.maxIdle}")
        private int maxIdle;
        @Value("${redis.pool.maxWait}")
        private long maxWaitMillis;
        @Value("${redis.pool.testOnBorrow}")
        private boolean testOnBorrow;
        
        @Autowired
        private JedisPoolConfig jedisPoolConfig;
        @Autowired
        private JedisPoolWriper jedisWritePool;
        @Autowired
        private JedisUtil jedisUtil;
        /**
         * 创建redis连接池的设置
         * 
         * @return
         */
        @Bean(name = "jedisPoolConfig")
        public JedisPoolConfig createJedisPoolConfig() {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            //控制一个pool可分配多少个jedis实例
            jedisPoolConfig.setMaxTotal(maxTotal);
            jedisPoolConfig.setMaxIdle(maxIdle);
            jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
            jedisPoolConfig.setTestOnBorrow(testOnBorrow);
            return jedisPoolConfig;
        }
        /**
         * 创建Redis连接池,并做相关配置
         * 
         * @return
         */
        @Bean(name = "jedisWritePool")
        public JedisPoolWriper createJedisPoolWriper() {
            JedisPoolWriper jedisPoolWriper = new JedisPoolWriper(jedisPoolConfig, hostname, port);
            return jedisPoolWriper;
        }
        /**
         * 创建Redis工具类,封装好Redis的连接以进行相关的操作
         * 
         * @return
         */
        @Bean(name = "jedisUtil")
        public JedisUtil createJedisUtil() {
            JedisUtil jedisUtil = new JedisUtil();
            jedisUtil.setJedisPool(jedisWritePool);
            return jedisUtil;
        }
        /**
         * Redis的key操作
         * 
         * @return
         */
        @Bean(name = "jedisKeys")
        public JedisUtil.Keys createJedisKeys() {
            JedisUtil.Keys jedisKeys = jedisUtil.new Keys();
            return jedisKeys;
        }
        /**
         * Redis的Strings操作
         * 
         * @return
         */
        @Bean(name = "jedisStrings")
        public JedisUtil.Strings createJedisStrings() {
            JedisUtil.Strings jedisStrings = jedisUtil.new Strings();
            return jedisStrings;
        }
    }
    

    然后把其他的文件复制到boot中
    接下来转移web.xml文件的配置信息

    <mvc:annotation-driven />
    
        <!-- 2.静态资源默认servlet配置 (1)加入对静态资源的处理:js,gif,png (2)允许使用"/"做整体映射 -->
        <mvc:resources mapping="/resources/**"  location="/resources/" />
        <mvc:default-servlet-handler />
    
        <!-- 3.定义视图解析器 -->
        <bean id="viewResolver"
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/html/"></property>
            <property name="suffix" value=".html"></property>
        </bean>
        <!-- 文件上传解析器 -->
        <bean id="multipartResolver"
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <property name="defaultEncoding" value="utf-8"></property>
            <!-- 1024 * 1024 * 20 = 20M -->
            <property name="maxUploadSize" value="20971520"></property>
            <property name="maxInMemorySize" value="20971520"></property>
        </bean>
    
        <!-- 4.扫描web相关的bean -->
        <context:component-scan base-package="com.tzf.o2o.web" />
    <!-- 5.权限拦截器 -->
        <mvc:interceptors>
            <!-- 校验是否已登录了店家管理系统的拦截器 -->
            <mvc:interceptor>
                <mvc:mapping path="/shopadmin/**" />
                <bean id="ShopInterceptor"
                    class="com.tzf.o2o.interceptor.shopadmin.ShopLoginInterceptor"/>
            </mvc:interceptor>
            <!-- 校验是否对该店铺有操作权限的拦截器 -->
            <mvc:interceptor>
                <mvc:mapping path="/shopadmin/**" />
                <mvc:exclude-mapping path="/shopadmin/shoplist" />
                <mvc:exclude-mapping path="/shopadmin/getshoplist" />
                
                <mvc:exclude-mapping path="/shopadmin/getshopinitinfo" />
                <mvc:exclude-mapping path="/shopadmin/registershop" />
                <mvc:exclude-mapping path="/shopadmin/shopoperation" />
                
                <mvc:exclude-mapping path="/shopadmin/shopmanagement" />
                <mvc:exclude-mapping path="/shopadmin/getshopmanagementinfo" />
                <bean id="ShopPermissionInterceptor"
                    class="com.tzf.o2o.interceptor.shopadmin.ShopPermissionInterceptor" />
            </mvc:interceptor>
            
        </mvc:interceptors>
    

    在boot中文件的配置信息如下

    /**
     * 开启Mvc,自动注入spring容器。 WebMvcConfigurerAdapter:配置视图解析器
     * 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean
     * 
     * @author xiangze
     *
     */
    @Configuration
    //等价于<mvc:annotation-driven/>
    @EnableWebMvc
    public class MvcConfiguration  implements WebMvcConfigurer,ApplicationContextAware{
        // Spring容器
        private ApplicationContext applicationContext;
        
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    
        /**
         * 静态资源配置
         * 
         * @param registry
         */
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
    //      registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/");
            registry.addResourceHandler("/upload/**").addResourceLocations("file:F:/img/upload/");
    //      registry.addResourceHandler("/upload/**").addResourceLocations("file:/Users/baidu/work/image/upload/");
        }
    
        /**
         * 定义默认的请求处理器
         */
        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
        
        /**
         * 创建viewResolver
         * 
         * @return
         */
        @Bean(name = "viewResolver")
        public ViewResolver createViewResolver() {
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
            // 设置Spring 容器
            viewResolver.setApplicationContext(this.applicationContext);
            // 取消缓存
            viewResolver.setCache(false);
            // 设置解析的前缀
            viewResolver.setPrefix("/WEB-INF/html/");
            // 设置试图解析的后缀
            viewResolver.setSuffix(".html");
            return viewResolver;
        }
    
        /**
         * 文件上传解析器
         * 
         * @return
         */
        @Bean(name = "multipartResolver")
        public CommonsMultipartResolver createMultipartResolver() {
            CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
            multipartResolver.setDefaultEncoding("utf-8");
            // 1024 * 1024 * 20 = 20M
            multipartResolver.setMaxUploadSize(20971520);
            multipartResolver.setMaxInMemorySize(20971520);
            return multipartResolver;
        }
        
        @Value("${kaptcha.border}")
        private String border;
    
        @Value("${kaptcha.textproducer.font.color}")
        private String fcolor;
    
        @Value("${kaptcha.image.width}")
        private String width;
    
        @Value("${kaptcha.textproducer.char.string}")
        private String cString;
    
        @Value("${kaptcha.image.height}")
        private String height;
    
        @Value("${kaptcha.textproducer.font.size}")
        private String fsize;
    
        @Value("${kaptcha.noise.color}")
        private String nColor;
    
        @Value("${kaptcha.textproducer.char.length}")
        private String clength;
    
        @Value("${kaptcha.textproducer.font.names}")
        private String fnames;
    
        /**
         * 由于web.xml不生效了,需要在这里配置Kaptcha验证码Servlet
         */
        /**@Bean
        public ServletRegistrationBean<KaptchaServlet> servletRegistrationBean() throws ServletException {
            ServletRegistrationBean<KaptchaServlet> servlet = new ServletRegistrationBean<KaptchaServlet>(new KaptchaServlet(), "/Kaptcha");
            servlet.addInitParameter("kaptcha.border", border);// 无边框
            servlet.addInitParameter("kaptcha.textproducer.font.color", fcolor); // 字体颜色
            servlet.addInitParameter("kaptcha.image.width", width);// 图片宽度
            servlet.addInitParameter("kaptcha.textproducer.char.string", cString);// 使用哪些字符生成验证码
            servlet.addInitParameter("kaptcha.image.height", height);// 图片高度
            servlet.addInitParameter("kaptcha.textproducer.font.size", fsize);// 字体大小
            servlet.addInitParameter("kaptcha.noise.color", nColor);// 干扰线的颜色
            servlet.addInitParameter("kaptcha.textproducer.char.length", clength);// 字符个数
            servlet.addInitParameter("kaptcha.textproducer.font.names", fnames);// 字体
            return servlet;
        }
         */
        /**
         * 添加拦截器配置
         */
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            /** 店家管理系统拦截部分 **/
            String interceptPath = "/shopadmin/**";
            // 注册拦截器
            InterceptorRegistration loginIR = registry.addInterceptor(new ShopLoginInterceptor());
            // 配置拦截的路径
            loginIR.addPathPatterns(interceptPath);
            loginIR.excludePathPatterns("/shopadmin/addshopauthmap");
            // 还可以注册其它的拦截器
            InterceptorRegistration permissionIR = registry.addInterceptor(new ShopPermissionInterceptor());
            // 配置拦截的路径
            permissionIR.addPathPatterns(interceptPath);
            // 配置不拦截的路径
            /** shoplist page **/
            permissionIR.excludePathPatterns("/shopadmin/shoplist");
            permissionIR.excludePathPatterns("/shopadmin/getshoplist");
            /** shopregister page **/
            permissionIR.excludePathPatterns("/shopadmin/getshopinitinfo");
            permissionIR.excludePathPatterns("/shopadmin/registershop");
            permissionIR.excludePathPatterns("/shopadmin/shopoperation");
            /** shopmanage page **/
            permissionIR.excludePathPatterns("/shopadmin/shopmanagement");
            permissionIR.excludePathPatterns("/shopadmin/getshopmanagementinfo");
        permissionIR.excludePathPatterns("/shopadmin/addshopauthmap");
        }
        
    }
    

    相关文章

      网友评论

          本文标题:SpirngMVC框架转SpringBoot

          本文链接:https://www.haomeiwen.com/subject/zuwjxhtx.html