文章目录
- 一、No operations defined in spec!
- 1.问题图片
- 2.解决方法
- 二、java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
- 1.问题图片
- 2.解决方法
- 三、AOP切点不够精确问题
- 1.问题描述
- 2.解决方案
- 总结
一、No operations defined in spec!
这是swagger报的错:一个接口都没有了,空空的。查了下原因是因为swagger没有找到注解标识的接口。
- 那么就可能是路径错了
- 或者注解没有正确使用
1.问题图片
2.解决方法
我的问题是这里包的路径写错了,修改为正确的路径解决。
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.enable(true)
.securitySchemes(Collections.singletonList(HttpAuthenticationScheme.JWT_BEARER_BUILDER
// 显示用
.name("JWT")
.build()))
.securityContexts(Collections.singletonList(SecurityContext.builder()
.securityReferences(Collections.singletonList(SecurityReference.builder()
.scopes(new AuthorizationScope[0])
.reference("JWT")
.build()))
// 声明作用域
.operationSelector(o -> o.requestMappingPattern().matches("/.*"))
.build()))
.select()
.apis(RequestHandlerSelectors.basePackage("com.cms.controller")) // 设置扫描路径
.build();
}
除了我的这个情况,还可以尝试以下方法:
-
检查 Swagger 规范文件:确保 Swagger 规范文件中正确定义了 API 操作,包括每个接口的路径、请求方法、参数、响应等信息。如果规范文件中确实没有定义任何操作,就会出现这个错误。
-
检查 Swagger 注解:在代码中使用 Swagger 注解时,确保每个接口都有正确的注解,包括 @ApiOperation、@Api、@ApiParam 等,这些注解会被 Swagger 解析生成 API 文档。
-
重启应用程序:有时候重新启动应用程序可以解决一些 Swagger 显示问题,尝试重启应用程序看看是否能够解决这个错误。
-
更新 Swagger 版本:如果以上方法都无效,考虑更新 Swagger 相关的依赖库到最新版本,有时候新版本可能修复了一些 bug 或问题。
二、java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter
1.问题图片
2.解决方法
这是我登录的时候出现的问题:同样的代码,jdk版本,但是一个项目报错,一个项目不报错。
我查了下解决方案:
- 引入依赖,实践成功
implementation 'javax.xml.bind:jaxb-api:2.3.1'
-
检查 JDK 版本:确保项目使用的 JDK 版本与相关依赖库兼容。推荐使用较旧版本的 JDK,因为较新版本的 JDK 中移除了一些 Java EE 相关的类。
-
指定 Java EE 模块路径:如果你使用的是较新的 JDK,可以尝试通过 --add-modules java.xml.bind 参数指定 Java EE 模块路径,以使 DatatypeConverter 类可用。
-
更新相关库:如果使用的是第三方库,尝试更新到最新版本,有时候新版本会修复此类依赖问题。
三、AOP切点不够精确问题
1.问题描述
通过AOP进行记录操作日志,因为引入了swagger,就想要直接使用controller的注解ApiOperation作为切点。
但是由于我有一些接口时服务之间相互调用的,这就导致了我aop记录日志的时候会把调用的接口以及调用子服务的接口全部都记录下来,这不是我的初衷。
2.解决方案
- 精确切点,使用within和&&来控制条件
- &&,必须满足两个条件
- within,包及子包下的所有类
// 切点
@Pointcut("within(com.cms.controller..*) && @annotation(io.swagger.annotations.ApiOperation)")
public void pointcut() {
}
总结
在项目开发中,遇到 “No operations defined in spec!” 错误时,需要检查Swagger规范文件和注解是否正确定义,尝试重启应用程序或更新Swagger版本;
对于"java.lang.NoClassDefFoundError: javax/xml/bind/DatatypeConverter"错误,可添加相关依赖库、检查JDK版本兼容性或指定Java EE模块路径;
而针对AOP切点不够精确的问题,应当优化切点表达式、使用更具体的条件来定义切点,确保准确匹配目标方法。