解决swagger2 不支持中文tags 及 抛出Illegal DefaultValue %s for parameter type 异常

我们在使用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;
    }}



就不会抛出异常,问题解决了


关于作者

Dane.shang
小开发
获得点赞
文章被阅读