Swagger documentation for Model object

58 views
Skip to first unread message

sharath karnati

unread,
Aug 16, 2017, 1:10:36 PM8/16/17
to Swagger

 
Hi All,

    We are having User as model object, and pojo class having following fields with getters/setters methods:

    private long id;    
   
private String name;    
   
private int age;    
   
private double salary;

  Using Spring MVC with swagger integration, when I open swagger (swagger-ui.html)

  it is displaying json object as below: 

[
  {
    "age": 0,
    "id": 0,
    "name": "string",
    "salary": 0
  }
]

As per requirement, we'd like to change the property name to appear as "User Name" in place of "name" field. The field description
need be read from .properties file. To implement this change I add following code

package com.api.util;
import java.util.HashSet;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.OperationBuilderPlugin;
import springfox.documentation.spi.service.contexts.OperationContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger.common.SwaggerPluginSupport;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfig {

   
@Bean
   
public Docket api(){
       
return new Docket(DocumentationType.SWAGGER_2)
           
.select()
           
.apis(RequestHandlerSelectors.basePackage("com.api.controller"))
           
.paths(PathSelectors.any())
           
.build().apiInfo(apiInfo());
       
   
}
   
   
private ApiInfo apiInfo() {
       
@SuppressWarnings("deprecation")
               
ApiInfo apiInfo = new ApiInfo(
         
"Connect Rest API",
         
"This API provides  Connect Report data",
         
"TOS",
         
"Terms of service",
         
"Connect Launch",
         
"@Use restricted",
         
"swagger-ui.html");
       
return apiInfo;
   
}
   
   
@Bean
   
public ApiOperationBuilderPlugin apiPlugin() {
       
return new ApiOperationBuilderPlugin();
   
}

   
@Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER)
   
public static class ApiOperationBuilderPlugin implements OperationBuilderPlugin {

       
@Autowired
       
protected MessageSource translator;

       
public boolean supports(DocumentationType delimiter) {
           
return true;
       
}

       
public void apply(OperationContext context) {
               
System.out.println("***** Inside apply OperationContext *****");
           
Set<ResponseMessage> messages = context.operationBuilder().build().getResponseMessages();
           
System.out.println("Inside apply OperationContext messages:"+messages);
           
           
Set<ResponseMessage> translated = new HashSet<ResponseMessage>();
           
for (ResponseMessage untranslated : messages) {
               
System.out.println("Inside apply OperationContext untranslated:"+untranslated);
               
String translation = translator.getMessage(untranslated.getMessage(), null, untranslated.getMessage(),
                       
null);
               
System.out.println("Inside apply OperationContext untranslated.getMessage:"+untranslated.getMessage());
               
//translated.add(new ResponseMessage(untranslated.getCode(), translation,
               
//        untranslated.getResponseModel(), untranslated.getHeaders()));
           
}
            context
.operationBuilder().responseMessages(translated);
       
}

   
}


}


 Added System.out lines to see whether it shows anything related to User object, but it is showing below lines in console

***** Inside apply OperationContext *****
Inside apply OperationContext messages:[springfox.documentation.service.ResponseMessage@c8, springfox.documentation.service.ResponseMessage@193, springfox.documentation.service.ResponseMessage@191, springfox.documentation.service.ResponseMessage@194]
Inside apply OperationContext untranslated:springfox.documentation.service.ResponseMessage@c8
Inside apply OperationContext untranslated.getMessage:OK
Inside apply OperationContext untranslated:springfox.documentation.service.ResponseMessage@193
Inside apply OperationContext untranslated.getMessage:Forbidden
Inside apply OperationContext untranslated:springfox.documentation.service.ResponseMessage@191
Inside apply OperationContext untranslated.getMessage:Unauthorized
Inside apply OperationContext untranslated:springfox.documentation.service.ResponseMessage@194


Controller is having below lines:

@RequestMapping(value = "/user/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
       
public ResponseEntity<User> getUser(@PathVariable("id") long id) {
               
System.out.println("Fetching User with id " + id);
               
User user = userService.findById(id);
               
if (user == null) {
                       
System.out.println("User with id " + id + " not found");
                       
return new ResponseEntity<User>(HttpStatus.NOT_FOUND);
               
}
               
return new ResponseEntity<User>(user, HttpStatus.OK);
       
}


Can someone please let me know, how to resolve this issue.


Thanks in advance.

Regards,
Sharath Karnati.




sharath karnati

unread,
Aug 18, 2017, 9:50:54 AM8/18/17
to Swagger
Hi All,

  Can someone please help me how to resolve this issue.

  Thanks for your help.

Regards,
Sharath.
Reply all
Reply to author
Forward
0 new messages