我们在使用swagger2 得时候,有时候需要在接口上使用@Api的注解,对controller进行swagger文档动态生成,@Api注解里有几个常用值,value,tags , description, value不会在页面上展现 ,tags 可以修改文档中controller 的名称,description对controller 进行注释。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Api { String value() default "";
String[] tags() default {""};
/** @deprecated */
@Deprecated
String description() default "";
/** @deprecated */
@Deprecated
String basePath() default "";
/** @deprecated */
@Deprecated
int position() default 0;
String produces() default "";
String consumes() default "";
String protocols() default "";
Authorization[] authorizations() default {@Authorization("")};
boolean hidden() default false;
}
我们通常会使用 tags来修饰我们的接口分组,使其更加清晰明了。
但是,在swagger2低版本中,tags不支持中文,如果 @Api(tags = "中文")时,接口会无法点击展开,这应该是swagger2的一个版本bug,可以通过swagger版本进行解决,我们把swagger2版本升级为2.9.2 即可解决这个问题;
但是,swagger2 2.9.2版本还会有一个bug,那就是如果实体类中用
@ApiModelProperty
private Integer id;
来修饰,启动项目的时候会抛出
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_171]
at java.lang.Long.parseLong(Long.java:601) ~[na:1.8.0_171] at java.lang.Long.valueOf(Long.java:803) ~[na:1.8.0_171]
at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412) ~[swagger-models-1.5.20.jar:1.5.20]
at sun.reflect.GeneratedMethodAccessor109.invoke(Unknown Source) ~[na:na] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171] at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:687) [jackson-databind-2.9.6.jar:2.9.6]
这个问题也是由于swagger2的版本造成的
在swagger解析 @ApiModelProperty 的参数时,会解析 example默认值的值,当为Integer 的时候,example的默认值是"",外面进行解析的时候,会把Integer 转换为Long ,就会抛出异常
public Object getExample() {
if (this.example == null) {
return null;
} else { try {
if ("integer".equals(this.type)) {
return Long.valueOf(this.example);
}
if ("number".equals(this.type)) {
return Double.valueOf(this.example);
}
if ("boolean".equals(this.type) && ("true".equalsIgnoreCase(this.example) || "false".equalsIgnoreCase(this.defaultValue))) {
return Boolean.valueOf(this.example);
} } catch (NumberFormatException var2) {
LOGGER.warn(String.format("Illegal DefaultValue %s for parameter type %s", this.defaultValue, this.type), var2);
}
return this.example;
}}
LOGGER.warn(String.format("Illegal DefaultValue %s for parameter type %s", this.defaultValue, this.type), var2);
这个问题也很好解决,
方法1,所有 Integer 的 都加上 example
@ApiModelProperty(value = "id",example = "100")
private Integer id;
方法2.,升级 swagger-models的版本就可以了
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.22</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.22</version>
</dependency>
在新版本中
@JsonProperty("x-example")
public Object getExample() {
if (this.example != null && !this.example.isEmpty()) {
try {
if ("integer".equals(this.type)) {
return Long.valueOf(this.example);
}
if ("number".equals(this.type)) {
return Double.valueOf(this.example);
}
if ("boolean".equals(this.type) && ("true".equalsIgnoreCase(this.example) || "false".equalsIgnoreCase(this.defaultValue))) {
return Boolean.valueOf(this.example);
} } catch (NumberFormatException var2) {
LOGGER.warn(String.format("Illegal DefaultValue %s for parameter type %s", this.defaultValue, this.type), var2);
}
return this.example;
} else { return this.example;
}}
就不会抛出异常,问题解决了