在項目開發過程中,使用Swagger2快速生成接口文檔,甚至進行Rest接口測試非常普遍。在某些項目中,請求的Header中往往設置一些全局標識用于認證,但又有部分Rest接口不需要驗證這個全局標識。而在進行Swagger2配置的時候,又只能設置全局header開關。
例如
@Configuration
@EnableSwagger2
public class Swagger2 {
@Bean
public Docket createRestApi() {
ParameterBuilder aParameterBuilder = new ParameterBuilder();
aParameterBuilder.name("openid").description("openid").modelRef(new ModelRef("string")).parameterType("header").required(true).build();
List<Parameter> aParameters = Lists.newArrayList();
aParameters.add(aParameterBuilder.build());
return new Docket(DocumentationType.SWAGGER_2)
.globalOperationParameters(aParameters)
.select()
.apis(RequestHandlerSelectors.basePackage("com.sam.demo.controller"))
.paths(PathSelectors.any())
.build();
}
}
這時候所有的Rest接口均需要header中有openid這個參數,如果某幾個Rest地址不需要呢?至少我沒找到Swagger2中對特定Rest路徑進行header設置的方法,網上大多數博文均提到采用Filter方式實現,個人覺得這樣會增加維護的負擔。
如果不是完美主義者,可以在Controller方法中通過設置非必填header類型參數以覆蓋全局設置。
例如
@RestController
@RequestMapping(value="/error")
public class ErrorController extends BaseController {
@RequestMapping(value="/404")
@ApiImplicitParam(name = "openid", value = "openid", required = false, dataType = "String",paramType="header")
public Object notFoundError(){
JsonResult result = new JsonResult("404","無效請求地址");
setReturnValMaskLogString(result);
return result;
}
@RequestMapping(value="/500")
@ApiImplicitParam(name = "openid", value = "openid", required = false, dataType = "String",paramType="header")
public Object serverError(){
JsonResult result = new JsonResult("500", "內部異常");
setReturnValMaskLogString(result);
return result;
}
}
這時候Swagger頁面還是會顯示openid參數的輸入框,
EBVJ2{6SV3)@ZVQ18@PGE)1.png
openid已不是必填項,雖影響美觀,但也將就應付,畢竟不是核心功能。