在swagger 2和spring boot 2中使用我自己的输入时出错

时间:2018-09-12 18:30:27

标签: spring-boot groovy swagger swagger-ui swagger-2.0

我刚开始使用Spring Boot,并试图为我正在使用的Web应用程序设置一个简单的文档。当我的端点仅需要字符串,列表或其他基本请求主体时,它工作得很好,但是每当我使用自定义输入时,我都会收到此错误:由于无法解析指针,因此无法解析引用在文档中不存在 the error

我创建了一个只有一个端点的小型项目,以更轻松地进行搜索。那些是我招摇的依赖:

compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'

这是大张旗鼓的配置:

@Configuration
@EnableSwagger2
class SwaggerConfig {

    @Bean
    Docket productApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("io.example.bss.testswagger"))
                .paths(any())
                .build()
                .apiInfo(metaInfo())
    }
    private ApiInfo metaInfo() {
        ApiInfo apiInfo = new ApiInfo(

            "API",
            "A description",
            "0.0.1",
            "urn:tos",
            new Contact("someone", "https://www.google.com",
                    "an.email@gmail.com"),
            "",
            "",
            new ArrayList<VendorExtension>()
        )
        return apiInfo
    }
}

然后是控制器:

@Controller
class ControllerHello {

    @PostMapping("/")
    def hello(@RequestBody Profile profile){
        return "hello $profile.name $profile.surname, I see you're $profile.age years old"
    }
}

最后是DTO:

@ApiModel(value = "the profile containing the name surname and age of a person")
@Document
class Profile {
    @ApiModelProperty(notes = "the name of the person", required = true)
    String name
    @ApiModelProperty(notes = "the surname of the person", required = true)
    String surname
    @ApiModelProperty(notes = "the age of the person", required = true)
    int age
}

在类似的帖子中,有人建议在Docket中使用alternateTypeRules,但是我不确定它是否可以解决我的问题,而且我不知道如何设置它。

1 个答案:

答案 0 :(得分:0)

事实证明,swagger-ui遇到了麻烦,因为我的Profile类是用groovy编写的,并且在显示模型时考虑了元类。 通过像这样添加此行.ignoredParameterTypes(groovy.lang.MetaClass.class)即可解决问题:

@Bean
Docket productApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .select()
            .apis(RequestHandlerSelectors.basePackage("io.example.bss.testswagger"))
            .paths(any())
            .build()
            .apiInfo(metaInfo())
            .ignoredParameterTypes(groovy.lang.MetaClass.class)
}

这是我的出处:https://github.com/springfox/springfox/issues/752