1. 首先配置Swagger流程请看:
配置好Swagger后的页面其实可以正常展示我们的接口以及入参和出参数据了
但是我们返回给前端的数据需要统一做一下处理,那么这是需要给response包装一层通用的数据格式
例如:
这样前端同学可以根据响应数据获取相应的数据结果集
我们真正需要处理的数据可以放在data里面返回,那么data里面数据处理后就可以展示在Swagger接口Api的页面上了,这样前后端都能清楚地get到数据的指向含义,话不多说上代码~
2. Swagger展示response返回的嵌套的数据集信息及注释信息
使用泛型指定的Swagger,可以展示data的数据内部文档注释
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "返回数据结果集")
public class Result<T> implements Serializable {
@ApiModelProperty(value = "状态码", example = "200")
private int code;
@ApiModelProperty(value = "返回消息")
private String msg;
@ApiModelProperty(value = "返回数据")
private T data;
// 修改构造函数,使其可以接受int, java.lang.String, T作为参数
public Result(int code, String message, T data) {
this.code = code;
this.msg = message;
this.data = data;
}
public static Result suc(Object data){
return new Result(200, "操作成功", data);
}
public static Result fail(){
return new Result(400, "操作失败", null);
}
}
控制器的代码
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jx.wms.common.PageParam;
import com.jx.wms.common.Result;
import com.jx.wms.entity.User;
import com.jx.wms.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* <p>
* 前端控制器
* </p>
*
* @author JL
* @since 2023-10-25
*/
@RestController
@RequestMapping("/user")
@Api(value = "Controller", tags = { "用户相关接口" })
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/list")
public List<User> list(){
return userService.list();
}
@PostMapping("/listPage")
@ApiOperation(value = "分页数据接口")
public Result<IPage<User>> listPage(@RequestBody PageParam page){
Page<User> pageUser = new Page(page.getPageNum(), page.getPageSize());
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getName, page.getParam().get("name"));
IPage<User> userResult = userService.page(pageUser, queryWrapper);
return Result.suc(userResult);
}
}
返回数据的data里的嵌套User实体(正常来讲是用Vo,这里先略)
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* @author JL
* @since 2023-12-7
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value = "用户类Model")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value = "ID主键")
private Integer id;
@ApiModelProperty(value = "账号")
private String number;
@ApiModelProperty(value = "名字")
private String name;
@ApiModelProperty(value = "密码")
private String password;
@ApiModelProperty(value = "年龄")
private Integer age;
@ApiModelProperty(value = "性别:1女 2男")
private Integer sex;
@ApiModelProperty(value = "电话")
private String phone;
@ApiModelProperty(value = "角色:0超级管理员,1管理员,2普通账号")
private Integer roleId;
@ApiModelProperty(value = "是否有效:Y有效 其他无效")
private String isValid;
}
最后启动项目后访问Swagger我们可以发现返回数据data里面是有嵌套数据并带有注释信息的
通过泛型,即使是多个对象嵌套也能展示在Swagger Api页面上,这就是Swagger接口文档的使用
3. swagger 如何不被拦截器拦截,直接访问接口文档,可添加如下配置:
具体代码如下:
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception
{
// 注解标记允许匿名访问的url
ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests();
permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll());
httpSecurity
// CSRF禁用,因为不使用session
.csrf().disable()
// 禁用HTTP响应标头
.headers().cacheControl().disable().and()
// 认证失败处理类
.exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
// 基于token,所以不需要session
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
// 过滤请求
.authorizeRequests()
// 对于登录login 注册register 验证码captchaImage 允许匿名访问
.antMatchers("/login", "/register", "/captchaImage","/geb/model/callback", "/geb/conversion/downloadFile","/geb/task/callback","/geb/log/view","/send-email-code/*","/system/user/profile/forget-password").permitAll()
// 静态资源,可匿名访问
.antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated()
.and()
.headers().frameOptions().disable();
// 添加Logout filter
httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler);
// 添加JWT filter
httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
// 添加CORS filter
httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class);
httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class);
}
以此记录~