如何在Swagger OpenAPI 3中隐藏HttpServletRequest参数?
解决Swagger UI将HttpServletRequest标记为必填参数的问题
针对你遇到的Spring Boot 3.0.2搭配springdoc-openapi-ui 1.6.14时,HttpServletRequest被Swagger UI识别为必填URL参数的问题,提供以下几种可行方案:
方案1:直接标记参数为隐藏
在控制器方法的HttpServletRequest参数上添加@Parameter(hidden = true)注解,该注解来自org.springdoc.core.annotations.Parameter包,能直接让Swagger忽略这个参数:
import org.springdoc.core.annotations.Parameter; import jakarta.servlet.http.HttpServletRequest; // ... @GetMapping("/endpoint") public ResponseEntity<Object> Hello( @Parameter(hidden = true) HttpServletRequest request, @RequestParam String paramOne ) { // 方法逻辑 }
方案2:改为字段注入HttpServletRequest
如果你的控制器中多个方法都需要用到HttpServletRequest,可以将它作为类字段通过@Autowired注入,而不是作为方法参数,这样Swagger就不会把它识别为请求参数:
import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; @RestController public class YourController { @Autowired private HttpServletRequest request; @GetMapping("/endpoint") public ResponseEntity<Object> Hello(@RequestParam String paramOne) { // 直接使用this.request即可 return ResponseEntity.ok().build(); } }
方案3:全局配置忽略特定类型参数
如果希望全局范围内隐藏所有HttpServletRequest类型的方法参数,可以注册一个OperationCustomizer Bean,自动移除Swagger文档中该类型的参数:
import org.springdoc.core.customizers.OperationCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import jakarta.servlet.http.HttpServletRequest; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.parameters.Parameter; @Configuration public class SwaggerConfig { @Bean public OperationCustomizer hideHttpServletRequestParam() { return (operation, handlerMethod) -> { operation.getParameters().removeIf(param -> "HttpServletRequest".equals(param.getSchema().getType()) || HttpServletRequest.class.getName().equals(param.getSchema().get$ref()) ); return operation; }; } }
以上三种方案都能解决你的问题,根据实际场景选择即可。
内容的提问来源于stack exchange,提问作者Ho Quang Lam
相关产品推荐
相关产品推荐

