2017-11-15 39 views
9

मैं springfox-swagger22.7.0 के साथ एक स्प्रिंग बूट परियोजना है पर ध्यान नहीं देता और मैं निम्नलिखित नियंत्रक है:अकड़ @ApiParam कुछ गुण

@Api(tags = { "Some" }, description = "CRUD for Some Stuff") 
@RestController 
@RequestMapping(path = "/some") 
public class SomeController { 

    @ApiOperation(value = "Get some") 
    @GetMapping(value = "{someId}", produces = MediaType.APPLICATION_JSON_VALUE) 
    public Response getSomeById(@PathVariable("someId") Id someId) { 
    return ...; 
    } 
... 
} 

मैं Id वर्ग व्याख्या से क्या डॉक्स में प्रदर्शित किया जाता है को नियंत्रित करना चाहते हैं, और इस केवल एनोटेशन के कुछ हिस्सों के लिए काम कर रहा है, लेकिन सभी नहीं। Id वर्ग (जो एक पंजीकृत कनवर्टर String से Id गया है):

public class Id { 

    @ApiParam(value = "This is the description", defaultValue = "1f1f1f",required = true, name = "someId", type = "string") 
    private final Long id; 

    public Id(Long id) { 
    this.id = id; 
    } 

    public Long getId() { 
    return id; 
    } 
} 

अब Swagger JSON लौटे दिखता है इस प्रकार है:

"parameters":[{ 
    "name":"id", 
    "in":"query", 
    "description":"This is the description", 
    "required":true, 
    "type":"integer", 
    "default":"1f1f1f", 
    "format":"int64" 
}] 

मेरा प्रश्न (या संभवतः बग रिपोर्ट) है: क्यों कर रहे हैं @ApiParam एनोटेशन के कुछ हिस्सों का उपयोग किया गया (जैसे value, defaultValue और required), लेकिन अन्य name और type जैसे नहीं हैं? ऐसा क्यों लगता है कि मैं name या type को यहां नहीं बदल सकता? मेरे विशेष उपयोग के मामले के लिए, उत्तरार्द्ध वह है जिसे मैं string में बदलना चाहता हूं।

अद्यतन

मैं skadya की मदद से निम्नलिखित घटक जोड़ने पर बसे है।

@Component 
public class OverrideSwaggerApiParamBuilder implements 
ExpandedParameterBuilderPlugin { 

    @Override 
    public boolean supports(DocumentationType type) { 
    return DocumentationType.SWAGGER_2 == type; 
    } 

    @Override 
    public void apply(ParameterExpansionContext context) { 
    Optional<ApiParam> apiParamOptional = findApiParamAnnotation(context.getField().getRawMember()); 
    if (apiParamOptional.isPresent()) { 
     ApiParam param = apiParamOptional.get(); 
     context.getParameterBuilder() 
      .name(param.name()) 
      .modelRef(new ModelRef(param.type())) 
      .build(); 
    } 
    } 
} 

springfox के लेखक लगता है कि यह एक बग हो सकता है: https://github.com/springfox/springfox/issues/2107

उत्तर

4

डिफ़ॉल्ट रूप से, @ApiParam विशेषता 'नाम' और 'प्रकार' पैरामीटर नाम को ओवरराइड करने के लिए उपयोग किया जाता है और एपीआई विधि में निर्दिष्ट प्रत्यक्ष पैरामीटर का पता लगाया जाता है। जब आप किसी क्षेत्र पर @ApiParam का उपयोग करते हैं, तो प्रकार और नाम फ़ील्ड के नाम से घटाए जाते हैं और इसके घोषित प्रकार और ओवर्रिडन मान को नाम और प्रकार के लिए नहीं माना जाता है।

आप अभी भी इस व्यवहार में परिवर्तन करना चाहते हैं (यह springfox में डिजाइन द्वारा लग रहा है, आप कार्यान्वयन springfox.documentation.swagger.readers.parameter.SwaggerExpandedParameterBuilder पर एक नज़र हो सकता है), तो आप springfox.documentation.spi.service.ExpandedParameterBuilderPlugin जिल्द की एक कस्टम कार्यान्वयन पंजीकृत कर सकते हैं।

उदा।

@Component 
public class OverrideSwaggerApiParamNameBuilder implements ExpandedParameterBuilderPlugin { 

    @Override 
    public boolean supports(DocumentationType type) { 
     return DocumentationType.SWAGGER_2 == type; 
    } 

    @Override 
    public void apply(ParameterExpansionContext context) { 
     Optional<ApiParam> apiParamOptional = findApiParamAnnotation(context.getField().getRawMember()); 
     if (apiParamOptional.isPresent()) { 
      fromApiParam(context, apiParamOptional.get()); 
     } 
    } 

    private void fromApiParam(ParameterExpansionContext context, ApiParam apiParam) { 
     context.getParameterBuilder() 
       .name(emptyToNull(apiParam.name())); 
    } 

    private String emptyToNull(String str) { 
     return StringUtils.hasText(str) ? str : null; 
    } 
} 

उम्मीद है कि यह मदद करता है।

+1

आखिरकार यह चाल चल गई, मैंने कोड को थोड़ा और सरल बनाने के लिए थोड़ा सा बदल दिया और प्रकार को सेट करने के लिए 'modelRef()' का उपयोग किया। मैंने अपने प्रश्न को प्रतिबिंबित करने के लिए अद्यतन किया है। –

-1

आदर्श रूप में आप जबकि मॉडल गुणों के साथ @ApiModelProperty विधि पैरामीटर के साथ @ApiParam उपयोग करने के लिए की जरूरत है।

public @interface ApiParam { 
    /** 
    * The parameter name. 
    * The name of the parameter will be derived from the field/method/parameter name, 
    * however you can override it. 
    * Path parameters must always be named as the path section they represent. 
    */ 
    String name() default ""; 

सुनिश्चित नहीं हैं कि अगर प्रकार विशेषता नहीं है, लेकिन नीचे प्रकार से निपटने के लिए तरीका है:

public @interface ApiModelProperty { 

    /** 
    * The data type of the parameter. 
    * This can be the class name or a primitive. The value will override the data type as read from the class 
    * property. 
    */ 
    String dataType() default ""; 

...... 
+1

जैसा कि मैंने उल्लेख किया है, '@ अपिपाराम' के कुछ हिस्सों को उठाया जा रहा है (जैसे 'मूल्य' जो 'विवरण' बन जाता है, लेकिन अन्य नहीं हैं। –

-1

मैं @ApiParam में संस्करण 2.6.1 का उपयोग कर रहा है और खोजने में असमर्थ "प्रकार" विशेषता जबकि मैं देख सकता हूं कि आप इसके साथ "टाइप" का उपयोग कर रहे हैं। तो सुनिश्चित करें कि यह उपयोग करने के लिए उपलब्ध है। मैंने आपके द्वारा उल्लेखित परिदृश्य को संभालने के लिए @ApiModelProperty डेटा टाइप() प्रदान किया है।

+1

'टाइप' विशेषता उपलब्ध है, अन्यथा मेरा कोड संकलित नहीं होगा। इसे यहां देखा जा सकता है: https://github.com/swagger-api/swagger-core/blob/v1.5.13/modules/swagger-annotations/src/main/java/io/swagger/annotations/ApiParam.java –

संबंधित मुद्दे