рдЕрд╕реНрдкрддрд╛рд▓ рдХреЗ рдкреВрд░реНрд╡ рдХрд╛ рд╣реЙрдЯрдлрд╝рд┐рдХреНрд╕ рдпрд╛ тАЬрдЕрд░реЗ рд╕реНрд╡реИрдЧрд░! рдореЗрд░реА рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд╣рд╛рдБ рд╣реИрдВ? тАЭ

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рдорд╛рд╕реНрдЯрд░ рдХреЛ рд╣реЙрдЯрдлрд╝рд┐рдХреНрд╕ рдХреЗ рджреМрд░рд╛рди рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рд╣реИ? рдирд╣реАрдВ! рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдлрд▓ рд░рд╣рд╛!

рдпрд╣ рдХрд╣рд╛рдиреА рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдХрд┐ рдореИрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рдХреИрд╕реЗ рдЕрджреНрдпрддрди рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ред рдирддреАрдЬрддрди, рдореИрдВрдиреЗ рд╕реНрд╡реИрдЧрд░ (рджреВрд╕рд░реА рдмрд╛рд░) рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрд╛ред рдФрд░ рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рджреВрд░ рд╣реЛ рдЧрдпрд╛ рддрд╛рдХрд┐ рдореИрдВ рдЕрдкрдиреА рдмреАрдорд╛рд░ рдЫреБрдЯреНрдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛ рдФрд░ рдореЗрдВрдб рдкрд░ рдЪрд▓рд╛ рдЧрдпрд╛!


рдФрд░ рдЬрд╛рд╡рд╛ 8 рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдирд╣реАрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХред

рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдбреЙрдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рд╕реНрд╡реИрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдк рдПрдкреАрдЖрдИ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ:

0. рдЖрд╡рд╢реНрдпрдХ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝реЗрдВ, рдЬреИрд╕реЗ @RequestMapping рдФрд░ рдЗрддрдиреЗ рдкрд░ред

1. @ErrorCodes (рд╣рдорд╛рд░рд╛ рдЕрдкрдирд╛ рдПрдиреЛрдЯреЗрд╢рди) рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╕реВрдЪреАрдмрджреНрдз рдХрд░реЗрдВ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдпрд╣ рд╡рд┐рдзрд┐ рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддреА рд╣реИред

2. рдиреЛрдЯ рдлрд╝реАрд▓реНрдб рдореЗрдВ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @ApiOperation рдФрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдЬрд╛рдирдХрд╛рд░реА рдЬреЛрдбрд╝реЗрдВред

3. рдмрд╛рдХреА рдПрдиреЛрдЯреЗрд╢рди рдЬреЛрдбрд╝реЗрдВ ...

рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛ (рдЕрдирд╛рд╡рд╢реНрдпрдХ рдФрд░ рд╕рд░рд▓реАрдХреГрдд рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛):

@ApiOperation( value = "Some description.", notes = "List of possible error codes:" + "<ul>" + " <li>sms.verification.code.fail</li>" + "</ul>") @PostMapping("/security/confirmation/check") @ErrorCodes(values = {"sms.verification.code.fail"}) public ResponseDto check(@ApiParam @RequestBody @Valid RequestDto request) {... } 

рдмрд┐рдВрджреБ 2 рдореЗрд░реА рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рд╕реНрд░реЛрдд рдерд╛ рдЬрдм рдореИрдВрдиреЗ @ErrorCodes рдХреЛ рдЬреЛрдбрд╝рд╛, рд▓реЗрдХрд┐рди @ApiOperation рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреНрд░реБрдЯрд┐ рдХреЛрдб рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ред рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝реА-рд╕реА рдЪрд┐рдВрддрд╛ рдХреЗ рд╕рд╛рде, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреБрд▓реА рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рдЯреВ рдХреЛрдб рд░рд┐рд╡реНрдпреВ рдХреЛ рджреЗ рджрд┐рдпрд╛ред рдФрд░ рдпрд╣рд╛рдБ рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рдиреЛрдЯреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЧрдпрд╛ рд╣реВрдБ! рдЙрдиреНрд╣реЛрдВрдиреЗ рдпрд╣ рднреА рд╕рдордЭрд╛рдпрд╛ рдХрд┐ рд╕реНрд╡реИрдЧрд░ @ErrorCodes рд╕реЗ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрд╕ рд╢рд╛рдо, рдпрд╣ рд╕рдм рдЦреБрд╢реА рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ред рдЕрдкрдиреЗ рджреЛрд╖ рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдФрд░ рдмреАрдорд╛рд░ рдЫреБрдЯреНрдЯреА рдкрд░ рдЪрд▓реЗ рдЧрдПред

рд╢рд╛рдпрдж рдЗрд╕реЗ рд▓реЗрдирд╛ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ред рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╢реЗрд▓реНрдл рдкрд░ рдПрдХ рдЪреЗрдХ рдорд╛рд░реНрдХ рд▓рдЧрд╛рдПрдВ рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, рдореИрдХреНрд╕, рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ, рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ ...

рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдлрд▓ рдирд╣реАрдВ рд╣реБрдЖред рд╕рд╛рд░реА рд╢рд╛рдо рдФрд░ рдЕрдЧрд▓реА рд╕реБрдмрд╣ рд╕реНрд╡реИрдЧрд░ рдХреЛ рдкрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЗрди рд╕рдорд╛рди рдХреЛрдб рдХреЛ рдиреЛрдЯреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЦрд░реНрдЪ рдХреА рдЧрдИред

рд╕реНрдЯреЗрдк 1. рдХреЛрдИ рдпрд╣рд╛рдВ рдерд╛ ...


рдПрдХ рд╕рд░рд╕рд░реА рдЦреЛрдЬ рд╕реЗ, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рд╕реНрд╡реИрдЧрд░ рдХреЛ рджреЛрд╕реНрдд рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдереАред рд╕реНрдкреНрд░рд┐рдВрдЧрдлреЙрдХреНрд╕ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рднреА рдерд╛ рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдЖрдк рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ!

рдЦреБрд╢рд┐рдпреЛрдВ рдиреЗ рдореБрдЭреЗ рдЗрд╕ рдХрджрд░ рдврдХ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдо рд╕рд░реНрджреА рдФрд░ рдмреАрдорд╛рд░ рдЫреБрдЯреНрдЯреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рднреВрд▓ рдЧрдпрд╛! рдореЗрд░реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦ рдореЗрдВ, "рддреАрди рдмрд╛рд░ рдХрдВрдкрдиреА рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдирд╣реАрдВ", рдореИрдВ рдбреВрдмрддреЗ рд╣реБрдП рд▓реЛрдЧреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рддреАрди рдХрд╣рд╛рдирд┐рдпрд╛рдВ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реВрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдореИрдВ рдХреНрд░реЛрдо + рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдЬрд┐рд╕рдиреЗ рдХрдИ рдмрд╛рд░ рдЬреЗрдирдХрд┐рдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдЧрддрд┐ рджреАред рдореБрдЭреЗ рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдордЬрд╝рд╛ рдЖрдпрд╛! рд╕рдм рдХреЗ рдмрд╛рдж, рдпрд╣ рдПрдХ рдорд╛рдЗрдХреНрд░реЛрдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ! рдореЗрд░рд╛ рдмрд╣реБрдд, рдмрд╣реБрдд рд╕рд░рд▓ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рддрдм рдореИрдВ рдлрд┐рд░ рд╕реЗ рджрд┐рдирдЪрд░реНрдпрд╛ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рд╛ рдФрд░ рдкреНрд░реЗрд░рдгрд╛ рдкрд╛рдИред рдмрд░реНрдирдЖрдЙрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рдЗрд╕ рдмреАрдЪ, рд╕реНрд╡реИрдЧрд░ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред

рдХрд╛рд░реНрд░рд╡рд╛рдИ 2. рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!


рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ред рдореИрдВрдиреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрдкреНрд░рд┐рдВрдЧрдлрд╝реЙрдХреНрд╕ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдПрдХ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдпрд╛, рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдм рдХреБрдЫ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рд╕рд╣реА рдЬреЛрдбрд╝рд╛ред

рдкреНрд▓рдЧрдЗрдиред рд╕рдВрд╕реНрдХрд░рдг 1
 @Component @Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER + 1) public class SwaggerErrorCodesConfiguration implements OperationBuilderPlugin { /** * Appends note of operation. Adds error codes to note of operation. * <code> * <h3>List of possible errors:</h3> * <ul> * <li>error.code.1</li> * <li>error.code.2</li> * <li>error.code.3</li> * </ul> * </code> * @param context operation context */ @Override public void apply(OperationContext context) { Method operationMethod = context.getHandlerMethod().getMethod(); // Check method is annotated by @ErrorCodes ErrorCodes errorCodes = findAnnotation(operationMethod, ErrorCodes.class); if (errorCodes == null) { return; } StringBuilder errorCodesNote = new StringBuilder(); errorCodesNote.append("<h3>List of possible errors:</h3>"); errorCodesNote.append("<ul>"); for (String errorCode: errorCodes.values()) { errorCodesNote.append("<li>").append(errorCode).append("</li>"); } errorCodesNote.append("</ul>"); // Write new version of notes. context.operationBuilder().notes(errorCodesNote.toString()).build(); } @Override public boolean supports(DocumentationType delimiter) { return SwaggerPluginSupport.pluginDoesApply(delimiter); } } 


рдореИрдВрдиреЗ рдПрдХ рдРрд╕реА рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬреЛ @ApiOperation рдореЗрдВ рдиреЛрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

 @ApiOperation(value = "Some description.") @PostMapping("/security/confirmation/check") @ErrorCodes(values = {"sms.verification.code.fail"}) public ResponseDto check(@ApiParam @RequestBody @Valid RequestDto request) { ... } 

рд▓реЙрдиреНрдЪ рдФрд░ ... рдкрд░рд┐рдгрд╛рдо! рд╣реБрд░реНрд░реЗ, рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдиреЛрдЯреЛрдВ рдореЗрдВ sms.verification.code.fail рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛрдб рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛!



рдЪрд░рдг 3. рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред


рдлрд┐рд░ рдореИрдВрдиреЗ рдиреЛрдЯреНрд╕ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рдЬреЛрдбрд╝реЗ рдФрд░ рдореБрдЭреЗ рдпрд╣ рдХреЛрдб рдорд┐рд▓рд╛:

 @ApiOperation(value = "Some description.", notes = "Some initial note.") @PostMapping("/security/confirmation/check") @ErrorCodes(values = {"sms.verification.code.fail"}) public ResponseDto check(@ApiParam @RequestBody @Valid RequestDto request) { ... } 

рдлрд┐рд░ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдирддреАрдЬрд╛ ... рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдерд╛ред рдкреНрд░рд▓реЗрдЦрди (O_o) рдмрдирд╛рддреЗ рд╕рдордп рд╕реНрдкреНрд░рд┐рдВрдЧрдлреЙрдХреНрд╕ рдкреНрд▓рдЧрдЗрди рдиреЛрдЯреЛрдВ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИ!

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдХреИрд╕реЗ рд╕рдВрджрд░реНрдн.рдкреНрд░рд╡реЗрд╢рдирдмреНрдпреВрдмреНрд░рд▓ ()ред рдиреЛрдЯреНрд╕ (рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦрддрд╛ рд╣реВрдВ:

 public OperationBuilder notes(String notes) { this.notes = (String)BuilderDefaults.defaultIfAbsent(notes, this.notes); return this; } 

рдЙрдо ... рдареАрдХ рд╣реИ, рдлрд┐рд░ рд╣рдо рдиреЛрдЯреЛрдВ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рд▓реЗрдВрдЧреЗ рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЛрдб рдЬреЛрдбрд╝реЗрдВрдЧреЗред рдпрд╣ @ApiOperation рдПрдиреЛрдЯреЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рд╡рд╛рдВрдЫрд┐рдд рдореВрд▓реНрдп рд▓реЗрдВ рдФрд░ рдЬреЛ рдореИрдВ рдЦреБрдж рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕реЗ рдЬреЛрдбрд╝ рджреЗрдВред

рддреЛ, рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг ( gist.github.com рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ )

рдкреНрд▓рдЧрдЗрдиред рд╕рдВрд╕реНрдХрд░рдг 2
 @Component @Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER + 1) public class SwaggerErrorCodesConfiguration implements OperationBuilderPlugin { /** * Appends note of operation. Adds error codes to note of operation. * <code> * <h3>List of possible errors:</h3> * <ul> * <li>error.code.1</li> * <li>error.code.2</li> * <li>error.code.3</li> * </ul> * </code> * @param context operation context */ @Override public void apply(OperationContext context) { Method operationMethod = context.getHandlerMethod().getMethod(); // Check method is annotated by @ApiOperation ApiOperation apiOperation = findApiOperationAnnotation(operationMethod).orNull(); if (apiOperation == null) { return; } // Check method is annotated by @ErrorCodes ErrorCodes errorCodes = findAnnotation(operationMethod, ErrorCodes.class); if (errorCodes == null) { return; } // Prepend notes by using current value of notes in @ApiOperation StringBuilder errorCodesNote = new StringBuilder(apiOperation.notes()); errorCodesNote.append("<h3>List of possible errors:</h3>"); errorCodesNote.append("<ul>"); for (String errorCode: errorCodes.values()) { errorCodesNote.append("<li>").append(errorCode).append("</li>"); } errorCodesNote.append("</ul>"); // Write new version of notes. context.operationBuilder().notes(errorCodesNote.toString()).build(); } @Override public boolean supports(DocumentationType delimiter) { return SwaggerPluginSupport.pluginDoesApply(delimiter); } } 


рдЕрдм рддреЛ рдЬреИрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рд╡реИрд╕рд╛ рд╣реЛ рдЧрдпрд╛!



рдЪрд░рдг 4. рдЬрд╛рд╡рд╛ 8 рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?


рдкреНрд▓рдЧрдЗрди рдкрд░ рдХрд╛рдо рдХреА рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВ рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрд╛ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЧрд▓рдд рдерд╛, рдЬреЛ рдПрдиреЛрдЯреЗрд╢рди рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╕рдордп рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдорд╛рдирдХ рддрд░реАрдХреЗ рдирд╣реАрдВ рдереЗ рдЬреЛ рдХрд┐ java.util.Optional рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреЛрдИ ifPresent рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ orNull рд╡рд┐рдзрд┐ рд╣реИред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕реНрдкреНрд░рд┐рдВрдЧрдлреЙрдХреНрд╕ рдЕрдорд░реВрдж рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЯреАрдПрд▓, рдбреЙ


рдореИрдВрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧрдлреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрд╛ рдерд╛, рдЬреЛ рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рдШрдЯрдХ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ @ErrorCodes рдПрдиреЛрдЯреЗрд╢рди рд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдкреАрдврд╝реА рдХреЗ рдЪрд░рдг рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд▓рдЧрдЗрди рдХреЛрдб
 @Component @Order(SwaggerPluginSupport.SWAGGER_PLUGIN_ORDER + 1) public class SwaggerErrorCodesConfiguration implements OperationBuilderPlugin { /** * Appends note of operation. Adds error codes to note of operation. * <code> * <h3>List of possible errors:</h3> * <ul> * <li>error.code.1</li> * <li>error.code.2</li> * <li>error.code.3</li> * </ul> * </code> * @param context operation context */ @Override public void apply(OperationContext context) { Method operationMethod = context.getHandlerMethod().getMethod(); // Check method is annotated by @ApiOperation ApiOperation apiOperation = findApiOperationAnnotation(operationMethod).orNull(); if (apiOperation == null) { return; } // Check method is annotated by @ErrorCodes ErrorCodes errorCodes = findAnnotation(operationMethod, ErrorCodes.class); if (errorCodes == null) { return; } // Prepend notes by using current value of notes in @ApiOperation StringBuilder errorCodesNote = new StringBuilder(apiOperation.notes()); errorCodesNote.append("<h3>List of possible errors:</h3>"); errorCodesNote.append("<ul>"); for (String errorCode: errorCodes.values()) { errorCodesNote.append("<li>").append(errorCode).append("</li>"); } errorCodesNote.append("</ul>"); // Write new version of notes. context.operationBuilder().notes(errorCodesNote.toString()).build(); } @Override public boolean supports(DocumentationType delimiter) { return SwaggerPluginSupport.pluginDoesApply(delimiter); } } 

Source: https://habr.com/ru/post/hi420841/


All Articles