RuoYi添加接口 目录
Controller接口 首先我们添加接口需要在Controller的文件夹下面添加对应的Controller接口代码
这里我们以添加微博用户调度的接口为例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 @PreAuthorize("@ss.hasPermi('crawler:weiboUser:schedule')") @Log(title = "微博用户", businessType = BusinessType.INSERT) @PostMapping("/scheduleTask") public AjaxResult scheduleTask (@RequestBody Map<String, Long> params) { Long followerCount = params.get("followerCount" ); Long interval = params.get("interval" ); log.info("Received parameters: followerCount = " + followerCount + ", interval = " + interval); if (followerCount == null || interval == null ) { return AjaxResult.error("Invalid parameters" ); } String result = weiboUserService.scheduleWeiboTask(followerCount, interval); return AjaxResult.success(result); }
代码详解
@PreAuthorize("@ss.hasPermi('crawler:weiboUser:schedule')")
这里的代码是指定了具有指定权限的用户可以调用这个接口。这里既然指定了有权限的用户才能调用这个接口,也就说明我们在测试这个接口的时候需要先指定一个有权限的用户,需要拿取到用户的Token进行测试,并且调用这个接口的时候需要获取到用户信息才行
@Log(title = "微博用户", businessType = BusinessType.INSERT)
这里的代码是一个自定义的注解,指定了这里的业务操作类型属于insert(插入操作)
@PostMapping("/scheduleTask")
Post请求
AjaxResult 这是SpringBoot常见的响应结构,标准化响应结构
添加对应的Service接口 这里在IWeiboUserService下添加
1 2 3 4 5 6 7 8 String scheduleWeiboTask (Long followerCount, Long interval) ;
在Servcie的业务层进行处理 WeiboUserServiceImpl.java
1 2 3 4 5 6 7 8 9 10 @Override public String scheduleWeiboTask (Long followerCount, Long interval) { DynamicDataSourceContextHolder.setDataSourceType("master" ); Map<String, Long> params = new HashMap <>(); params.put("followerCount" , followerCount); params.put("interval" , interval); int result = weiboUserMapper.insertWeiBoScheduleTask(params); DynamicDataSourceContextHolder.clearDataSourceType(); return result > 0 ? "Task scheduled successfully" : "Failed to schedule task" ; }
代码解析 DynamicDataSourceContextHolder.setDataSourceType("master");
这里我们是切换到了Mysql数据源,因为这个代码最上方指定了在Doris数据源@DataSource(value = DataSourceType.DORIS)
而我们的表是在mysql内的
我们需要先去看一下当前的数据源配置,现在是使用Druid配置了多种数据源,查看application-druid.yml中的配置会发现我们配置了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 datasource: type: com.alibaba.druid.pool.DruidDataSource druid: master: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/bigdata-management-platform?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: root slave: enabled: false url: username: password: doris: driverClassName: com.mysql.cj.jdbc.Driver enabled: true url: jdbc:mysql://172.xx.xx.xxx:9030/default_cluster:task_center username: root password: xxxxx
于是在切换数据源的时候需要添加DynamicDataSourceContextHolder.setDataSourceType("mysql");
Mapper接口 1 int insertWeiBoScheduleTask (Long followerCount, Long interval) ;
调整安全认证(用于测试) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 @Override protected void configure (HttpSecurity httpSecurity) throws Exception { ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests(); permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll()); httpSecurity .csrf().disable() .headers().cacheControl().disable().and() .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() .authorizeRequests() .antMatchers("/login" , "/register" , "/captchaImage" ).permitAll() .antMatchers(HttpMethod.GET, "/" , "/*.html" , "/**/*.html" , "/**/*.css" , "/**/*.js" , "/profile/**" ).permitAll() .antMatchers("/swagger-ui.html" , "/swagger-resources/**" , "/webjars/**" , "/*/api-docs" , "/druid/**" ).permitAll() .antMatchers("/crawler/weiboUser/scheduleTask" ).permitAll() .anyRequest().authenticated() .and() .headers().frameOptions().disable(); httpSecurity.logout().logoutUrl("/logout" ).logoutSuccessHandler(logoutSuccessHandler); httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class); httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class); httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class); }
代码详解 .antMatchers("/crawler/weiboUser/scheduleTask").permitAll() // 允许匿名访问该路径
这里主要是加上了一个允许匿名访问的路径,这里的路径需要与前面我们在Controller层设置的路径相同
更改MyBatis映射文件 这里主要的写入数据库的逻辑都写在了WeiboUserMapper.xml中,我们可以在这个文件中看到很多的插入写入的操作
1 2 3 4 5 <!-- 添加调度写入到调度数据库 --> <insert id="insertWeiBoScheduleTask" parameterType="map" > INSERT INTO weibo_schedule_task (follower_count, interval) VALUES (#{followerCount}, #{interval}) </insert>
获取token 获取登录Token的代码主要在SysLoginController.java文件中 我们只需要在登录的接口中加上打印出Token就好
1 2 3 4 5 6 7 8 9 10 11 @PostMapping("/login") public AjaxResult login (@RequestBody LoginBody loginBody) { AjaxResult ajax = AjaxResult.success(); String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), loginBody.getUuid()); ajax.put(Constants.TOKEN, token); System.out.println("Token : " +token); return ajax; }
测试接口 这里官方提供了swagger-ui来进行测试接口,我们也可以选择postman的方式测试接口
这里我们会发现会返回响应是:
1 2 3 4 { "msg" : "Task scheduled successfully" , "code" : 200 }
当出现这种标识的时候说明我们基本的添加接口开发已经成功,需要查看mysql表中是否有对应的数据
错误总结 Mybatis映射错误 如果我们发送请求测试后发现响应返回为:
{ "msg": "nested exception is org.apache.ibatis.binding.BindingException: Parameter 'followerCount' not found. Available parameters are [arg1, arg0, param1, param2]", "code": 500 }
看到这个响应标识说明我们的Mybatis映射出现错误,需要看一下前面步骤中有些地方可能没有对应上,再需要看一下表的结构与数据库中表的结构是否对应