SpringBoot3.1.2 引入Swagger报错Type javax.servlet.http.HttpServletRequest not present解决办法
作者:liyinchi1988
1.问题描述:
引入swagger2.X版本后,导致SpringBoot3.1.2启动报错
2.原因分析:
SpringBoot3.1.2版本依赖于jakarta依赖包,但是Swagger依赖底层应用的javax依赖包,所以只要一启动就会报错。
3.解决办法:
pom.xml文件,移除swagger2
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.9.0</version> <scope>provided</scope> </dependency>
加入
<dependency> <groupId>io.swagger.core.v3</groupId> <artifactId>swagger-annotations</artifactId> <version>2.2.15</version> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.1.0</version> </dependency>
代码修改
@Api(tags = "") 改为 @Tag(name = "") @ApiModel(value="", description="") 改为 @Schema(name="", description="") @ApiModelProperty(value = "", required = true) 改为 @Schema(name= "", description = "", required = true) @ApiOperation(value = "", notes = "") 改为 @Operation(summary = "", description = "") @ApiParam 改为 @Parameter @ApiResponse(code = 404, message = "") 改为 @ApiResponse(responseCode = "404", description = "")
SwaggerConfig.java
package com.example.lyc.springboot.demo.config; import org.springdoc.core.models.GroupedOpenApi; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SwaggerConfig { @Bean public GroupedOpenApi publicApi() { return GroupedOpenApi.builder() .group("public") .pathsToMatch("/public/**") .build(); } @Bean public GroupedOpenApi privateApi() { return GroupedOpenApi.builder() .group("private") .pathsToMatch("/private/**") .build(); } }
实体类
package com.example.lyc.springboot.demo.entity; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @Data @AllArgsConstructor @NoArgsConstructor @Component @Schema(name = "User", description = "用户实体类") public class User { @Schema(name = "id", description = "用户id") private int id; @Schema(name = "userName", description = "用户名") private String userName; @Schema(name = "password", description = "密码") private String password; /* 省略get、set和带参构造方法 */ }
controller类
package com.example.lyc.springboot.demo.controller; import com.example.lyc.springboot.demo.config.MicroServiceUrl; import com.example.lyc.springboot.demo.entity.User; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.beans.factory.annotation.Value; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @RestController @RequestMapping("/v1") @Schema(name="", description="") @Tag(name = "JsonController tags") public class JsonController { @Value("${microservice.url.orderUrl}") String orderUrl;// orderUrl变量值 就是application.yml的url.orderUrl值 @Autowired private User user;// 注入 @Autowired MicroServiceUrl MicroServiceUrl; // 注入配置类 @GetMapping("/user") @ResponseBody @Operation(summary = "获取用户信息", description = "获取用户信息") public User getUser() { user.setId(1); user.setUserName("李银池"); user.setPassword("123456"); // 日志输出 log.info("user:{}", user); // 返回 return user; } /*** * @Description: list * @Author: liyinchi * @Date: 2023/9/18 11:17 * @return map */ @GetMapping("/list") @ResponseBody @Operation(summary = "获取用户列表", description = "获取用户列表") public List<User> getUserList() { List<User> userList = new ArrayList<>(); User user1 = new User(1, "李银池", "123456"); User user2 = new User(2, "王哈哈", "123456"); userList.add(user1); userList.add(user2); // 日志输出 log.info("userList:{}", userList); // 返回数据 return userList; } /*** * @Description: map * @Author: liyinchi * @Date: 2023/9/18 11:17 * @return map */ @GetMapping("/map") @ResponseBody @Operation(summary = "获取用户信息", description = "获取用户信息") public Map<String, Object> getMap() { Map<String, Object> map = new HashMap<>(3); User user = new User(1, "李银池", "123456"); map.put("作者信息", user); map.put("github", "https://github.com/liyinchigithub"); map.put("CSDN地址", "https://blog.csdn.net/u013302168"); map.put("粉丝数量", 252); // 日志输出 log.info("map:{}", map); // 返回 return map; } /*** * @Description: 读取application.yml配置文件参数 * @Author: liyinchi * @Date: 2023/9/18 11:17 * @return map */ @GetMapping("/getYMLConfig") @ResponseBody @Operation(summary = "获取配置文件参数", description = "获取配置文件参数") public Map<String,Object> getYMLConfig() { Map<String,Object> orderUrlList = new HashMap(); orderUrlList.put("microservice url orderUrl",orderUrl); log.info("orderUrl:{}", orderUrl); return orderUrlList; } /*** * @Description: 读取application.yml配置文件参数 * @Author: liyinchi * @Date: 2023/9/18 11:17 * @return map */ @GetMapping("/getYMLConfigClass") @ResponseBody @Operation(summary = "获取配置文件参数", description = "获取配置文件参数") public Map<String,Object> getYMLConfigClass() { Map<String,Object> orderUrlList = new HashMap(); orderUrlList.put("orderUrl",MicroServiceUrl.getOrderUrl()); orderUrlList.put("userUrl",MicroServiceUrl.getUserUrl()); orderUrlList.put("shoppingUrl",MicroServiceUrl.getShoppingUrl()); log.info("getYMLConfigClass orderUrlMap:{}", orderUrlList); return orderUrlList; } /*** * @Description: 获取请求体 * @Date: 20239/18 14:00 * @param User user * @return map */ @PostMapping("/addUser") @ResponseBody @Operation(summary = "获取请求体", description = "获取请求体") public Map<String,Object> getUser(@RequestBody @Parameter User user) { // 获取请求体 Map<String,Object> map = new HashMap(); map.put("user",user); return map; } }
遇到报错:
java.lang.StringIndexOutOfBoundsException: begin 11, end 10, length 10
原因分析:
由于Springdoc OpenAPI UI的版本与Spring Boot的版本不兼容导致的。你正在使用的Springdoc OpenAPI UI的版本是2.1.0,而Spring Boot的版本是3.1.2。这两个版本可能存在不兼容的问题。
解决办法:
你可以尝试将Springdoc OpenAPI UI的版本升级到与Spring Boot 3.1.2更兼容的版本。你可以在Springdoc的GitHub仓库的release页面查看各个版本的发布说明,找到一个与Spring Boot 3.1.2兼容的版本。
然后,你可以在你的pom.xml文件中更新Springdoc OpenAPI UI的版本:
<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-ui</artifactId> <version>新的版本号</version> </dependency>
https://github.com/springdoc/springdoc-openapi/releases
修改成支持springboot3.1.2的版本2.2.0后,成功~
以上就是SpringBoot3.1.2 引入Swagger报错Type javax.servlet.http.HttpServletRequest not present解决办法的详细内容,更多关于SpringBoot3.1.2 引入Swagger报错的资料请关注脚本之家其它相关文章!