SpringBoot整合Swagger2案例,以及报错:java.lang.NumberFormatException: For input string: ""原因和解决办法

一、SpringBoot整合Swagger2案例

 1、先说SpringBoot如何整合Swagger2,然后再说报错问题。

用IDEA新建SpringBoot项目,只需勾选Web即可。

 

2、 在项目的pom文件中添加Swagger2相关依赖


       
            io.springfox
            springfox-swagger2
            2.9.2
        
        
            io.springfox
            springfox-swagger-ui
            2.9.2
        

3、待依赖导入完成后,在项目启动类中添加启动Swagger2的注解

SpringBoot整合Swagger2案例,以及报错:java.lang.NumberFormatException: For input string:

4、添加自定义的Swagger2的配置类Swagger2Config

SpringBoot整合Swagger2案例,以及报错:java.lang.NumberFormatException: For input string:

package com.zzz.swagger2;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

@Configuration
public class Swagger2Config {

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .pathMapping("/")
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.zzz.swagger2.controller"))//指定方法接口都来自controller这个包
                .paths(PathSelectors.any())//选any表示给这个controller包下所有的接口都生成文档
                .build().apiInfo(new ApiInfoBuilder()
                        .title("SpringBoot整合Swagger")//生成的接口文档的标题名称
                        .description("SpringBoot整合Swagger,详细信息......")//文档摘要
                        .version("1.0.0")//API版本,可以自定义
                        //文档制作人、个人主页地址、邮箱
                        .contact(new Contact("Kyo", "https://blog.csdn.net/weixin_43724369", "[email protected]"))
                        .description("Kyo的个人博客")//(可以不配置)
                        .license("The Apache License")//授权信息(可以不配置)
                        .licenseUrl("http://www.baidu.com")//授权地址(可以不配置)
                        .build());
    }
}

下图是项目启动后,对应上面的配置信息。不过现在项目还没配置完,先往下面看。

SpringBoot整合Swagger2案例,以及报错:java.lang.NumberFormatException: For input string:

 

 

5、接下来添加对应的实体类对象,和控制层方法,模拟增删改查

SpringBoot整合Swagger2案例,以及报错:java.lang.NumberFormatException: For input string:

①User对象

package com.zzz.swagger2.Bean;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;

@ApiModel
public class User {

    @ApiModelProperty("用户的id")
    private Long id;
    @ApiModelProperty("用户名")
    private String username;
    @ApiModelProperty("用户的地址")
    private String address;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

添加完User类后,可以启动项目了。

在浏览器中打开:http://127.0.0.1:8080/swagger-ui.html#/ 即可

 

上面的三行注解:

@ApiModelProperty("用户的id")
@ApiModelProperty("用户名")
@ApiModelProperty("用户的地址")

对应接口文档

SpringBoot整合Swagger2案例,以及报错:java.lang.NumberFormatException: For input string:

 

②UserController,采用Restful风格,模拟对User信息的增删改查操作。

package com.zzz.swagger2.controller;

import com.zzz.swagger2.Bean.User;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

@RestController
@Api(tags = "用户管理接口")
public class UserController {

    @ApiOperation("通过用户id查询一个用户")
    @ApiImplicitParam(name = "id",value = "用户id",defaultValue = "33")
    @GetMapping("/user")
    public User getUserById(Long id){
        User user=new User();
        user.setId(id);
        return user;
    }

    @DeleteMapping("/user/{id}")
    @ApiOperation("通过用户id删除一个用户")
    @ApiImplicitParam(name = "id",value = "用户id",defaultValue = "99")
    public Long deleteUserById(@PathVariable Long id){
        return id;
    }

    @PutMapping("/user")
    @ApiImplicitParams({@ApiImplicitParam(name = "id",value = "用户id",defaultValue = "80"),
            @ApiImplicitParam(name = "username",value = "用户名",defaultValue = "李四")})
    @ApiOperation("通过用户id更新用户名")
    public Long updateUsernameById(Long id, String username){
        return id;
    }

    @PostMapping("/user")
    @ApiOperation("添加用户")
    public User addUser(User user){
        return user;
    }
}

③再来一个HelloController,里面只有一个简单的返回字符串的方法

package com.zzz.swagger2.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(){
        return "hello swagger!";
    }
}

6、这时可以启动项目了,顺便说说controller层里的注解是什么意思

SpringBoot整合Swagger2案例,以及报错:java.lang.NumberFormatException: For input string:

 

 

二、报错:java.lang.NumberFormatException: For input string: ""原因和解决办法

项目启动之后,打开http://127.0.0.1:8080/swagger-ui.html#/ 后

你会发现控制台报错:

看意思是数值类型转换异常,原因是输入了一个空字符串 ,而且是把String转换成Long类型数值的过程中发生异常。

 

随便一分析,就知道我们刚刚定义的User类中,有一个Long类型的属性id

SpringBoot整合Swagger2案例,以及报错:java.lang.NumberFormatException: For input string:

 

 而在UserController中,我们给每个方法的参数id,都设置了默认值,即defaultValue。

却唯独没有给最后一个方法的参数id,设置默认值。罪魁祸首见下图:

SpringBoot整合Swagger2案例,以及报错:java.lang.NumberFormatException: For input string:

而根据报错信息来看,系统会自动把我们输入的String类型的id,转换成Long类型的id,再保存成JSON数据。

这个转换过程调用的就是Long.parseLong(),注意要求的是非空字符串!

由于我们没有给这个addUser()这个方法设置默认值,所以系统已启动,就自动尝试把空字符串转换成Long类型数值,所以就报错了。

 

所以,解决办法就很简单——给参数id设置任意一个默认值。如下:

@PostMapping("/user")
    @ApiImplicitParams({@ApiImplicitParam(name = "id",value = "用户id",defaultValue = "00"),
    @ApiImplicitParam(name = "username",value = "用户名",defaultValue = "请输入用户名")})
    @ApiOperation("添加用户")
    public User addUser(User user){
        return user;
    }

设置完,再启动项目就不会报错了。

你可能感兴趣的:(SpringBoot,Swagger2)