gpt4 book ai didi

java - swagger @ApiParam 忽略某些属性

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:20 25 4
gpt4 key购买 nike

我有一个带有 springfox-swagger2 2.7.0 的 Spring Boot 项目并且我有以下 Controller :

@Api(tags = { "Some" }, description = "CRUD for Some Stuff")
@RestController
@RequestMapping(path = "/some")
public class SomeController {

@ApiOperation(value = "Get some")
@GetMapping(value = "{someId}", produces = MediaType.APPLICATION_JSON_VALUE)
public Response getSomeById(@PathVariable("someId") Id someId) {
return ...;
}
...
}

我想通过注释 Id 类来控制文档中显示的内容,这仅适用于注释的某些部分,而不是全部。Id 类(它有一个从 StringId 的注册转换器):

public class Id {

@ApiParam(value = "This is the description", defaultValue = "1f1f1f",required = true, name = "someId", type = "string")
private final Long id;

public Id(Long id) {
this.id = id;
}

public Long getId() {
return id;
}
}

现在返回的 Swagger JSON 如下所示:

"parameters":[{
"name":"id",
"in":"query",
"description":"This is the description",
"required":true,
"type":"integer",
"default":"1f1f1f",
"format":"int64"
}]

我的问题(或可能是错误报告)是:为什么使用了 @ApiParam 注释的某些部分(如 valuedefaultValuerequired),但其他的不是,比如 nametype?为什么我不能在这里更改 nametype?对于我的特定用例,后者是我想更改为 string 的那个。

更新

在 skadya 的帮助下,我决定添加以下组件。

@Component
public class OverrideSwaggerApiParamBuilder implements
ExpandedParameterBuilderPlugin {

@Override
public boolean supports(DocumentationType type) {
return DocumentationType.SWAGGER_2 == type;
}

@Override
public void apply(ParameterExpansionContext context) {
Optional<ApiParam> apiParamOptional = findApiParamAnnotation(context.getField().getRawMember());
if (apiParamOptional.isPresent()) {
ApiParam param = apiParamOptional.get();
context.getParameterBuilder()
.name(param.name())
.modelRef(new ModelRef(param.type()))
.build();
}
}
}

springfox 的作者认为这可能是一个错误:https://github.com/springfox/springfox/issues/2107

最佳答案

默认情况下,@ApiParam 属性 'name' 和 'type' 用于覆盖 API 方法中指定的直接参数的参数名称和检测类型。当您在字段上使用 @ApiParam 时,类型和名称由字段的名称推导出来,并且不考虑其声明的类型和名称和类型的重写值。 (它看起来是在 springfox 中设计的,您可以查看实现 springfox.documentation.swagger.readers.parameter.SwaggerExpandedParameterBuilder)

如果您仍然希望改变这种行为,您可以注册一个自定义实现的 springfox.documentation.spi.service.ExpandedParameterBuilderPlugin interlace。

例如

@Component
public class OverrideSwaggerApiParamNameBuilder implements ExpandedParameterBuilderPlugin {

@Override
public boolean supports(DocumentationType type) {
return DocumentationType.SWAGGER_2 == type;
}

@Override
public void apply(ParameterExpansionContext context) {
Optional<ApiParam> apiParamOptional = findApiParamAnnotation(context.getField().getRawMember());
if (apiParamOptional.isPresent()) {
fromApiParam(context, apiParamOptional.get());
}
}

private void fromApiParam(ParameterExpansionContext context, ApiParam apiParam) {
context.getParameterBuilder()
.name(emptyToNull(apiParam.name()));
}

private String emptyToNull(String str) {
return StringUtils.hasText(str) ? str : null;
}
}

希望对您有所帮助。

关于java - swagger @ApiParam 忽略某些属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47317562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com