How to document @ControllerAdvice handled exception using Spring REST Docs









up vote
0
down vote

favorite












I have @ControllerAdvice annotated class, which is handling BadRequestException extends RuntimeException exception.



Now suppose that I have endpoint:



@PostMapping(value = "/createAccount")
public ResponseEntity<CreateAccountResponse> createAccount(@RequestBody @Valid CreateAccountRequest createAccountRequest) ...


In case of unwanted scenario, endpoint throws BadRequestException (with HTTP Status 400) which constructs error JSON object as following:



 
"errorCode": 123,
"errorMessage: "Failure reason"



Is there any way to document case like this using Spring REST Docs ?



This is example of my approach:



@Test
public void createAccountFailExample()

RestDocumentationResultHandler docs = document("create-acc-fail-example",
responseFields(
fieldWithPath("errorCode").type("Integer").description("Error code"),
fieldWithPath("errorMessage").type("String").description("Error message")
)
);

org.assertj.core.api.Assertions.assertThatThrownBy(() -> this.mockMvc.perform(RestDocumentationRequestBuilders.post("/createAccount")
.contextPath("/account")
.contentType(TestUtil.APPLICATION_JSON_UTF8)
.content(TestUtil.convertObjectToJsonBytes(new CreateAccountRequest("nameTest", "surnameTest"))))
.andExpect(status().isBadRequest())
.andDo(docs)).hasCause(new BadRequestException(ServiceError.SOME_FAIL_REASON));



In this case test passes, but no documentation (.adoc) files are created.



When I try something like this:



ResultActions resultActions = this.mockMvc.perform(RestDocumentationRequestBuilders.post("/createAccount")
.contextPath("/account")
.contentType(TestUtil.APPLICATION_JSON_UTF8)
.content(TestUtil.convertObjectToJsonBytes(new CreateAccountRequest("testName", "testSurname"))))
.andExpect(status().isBadRequest())
.andDo(docs);


test fails because NestedServletException was thrown caused by BadRequestException, and again there is no documentation created.










share|improve this question

























    up vote
    0
    down vote

    favorite












    I have @ControllerAdvice annotated class, which is handling BadRequestException extends RuntimeException exception.



    Now suppose that I have endpoint:



    @PostMapping(value = "/createAccount")
    public ResponseEntity<CreateAccountResponse> createAccount(@RequestBody @Valid CreateAccountRequest createAccountRequest) ...


    In case of unwanted scenario, endpoint throws BadRequestException (with HTTP Status 400) which constructs error JSON object as following:



     
    "errorCode": 123,
    "errorMessage: "Failure reason"



    Is there any way to document case like this using Spring REST Docs ?



    This is example of my approach:



    @Test
    public void createAccountFailExample()

    RestDocumentationResultHandler docs = document("create-acc-fail-example",
    responseFields(
    fieldWithPath("errorCode").type("Integer").description("Error code"),
    fieldWithPath("errorMessage").type("String").description("Error message")
    )
    );

    org.assertj.core.api.Assertions.assertThatThrownBy(() -> this.mockMvc.perform(RestDocumentationRequestBuilders.post("/createAccount")
    .contextPath("/account")
    .contentType(TestUtil.APPLICATION_JSON_UTF8)
    .content(TestUtil.convertObjectToJsonBytes(new CreateAccountRequest("nameTest", "surnameTest"))))
    .andExpect(status().isBadRequest())
    .andDo(docs)).hasCause(new BadRequestException(ServiceError.SOME_FAIL_REASON));



    In this case test passes, but no documentation (.adoc) files are created.



    When I try something like this:



    ResultActions resultActions = this.mockMvc.perform(RestDocumentationRequestBuilders.post("/createAccount")
    .contextPath("/account")
    .contentType(TestUtil.APPLICATION_JSON_UTF8)
    .content(TestUtil.convertObjectToJsonBytes(new CreateAccountRequest("testName", "testSurname"))))
    .andExpect(status().isBadRequest())
    .andDo(docs);


    test fails because NestedServletException was thrown caused by BadRequestException, and again there is no documentation created.










    share|improve this question























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      I have @ControllerAdvice annotated class, which is handling BadRequestException extends RuntimeException exception.



      Now suppose that I have endpoint:



      @PostMapping(value = "/createAccount")
      public ResponseEntity<CreateAccountResponse> createAccount(@RequestBody @Valid CreateAccountRequest createAccountRequest) ...


      In case of unwanted scenario, endpoint throws BadRequestException (with HTTP Status 400) which constructs error JSON object as following:



       
      "errorCode": 123,
      "errorMessage: "Failure reason"



      Is there any way to document case like this using Spring REST Docs ?



      This is example of my approach:



      @Test
      public void createAccountFailExample()

      RestDocumentationResultHandler docs = document("create-acc-fail-example",
      responseFields(
      fieldWithPath("errorCode").type("Integer").description("Error code"),
      fieldWithPath("errorMessage").type("String").description("Error message")
      )
      );

      org.assertj.core.api.Assertions.assertThatThrownBy(() -> this.mockMvc.perform(RestDocumentationRequestBuilders.post("/createAccount")
      .contextPath("/account")
      .contentType(TestUtil.APPLICATION_JSON_UTF8)
      .content(TestUtil.convertObjectToJsonBytes(new CreateAccountRequest("nameTest", "surnameTest"))))
      .andExpect(status().isBadRequest())
      .andDo(docs)).hasCause(new BadRequestException(ServiceError.SOME_FAIL_REASON));



      In this case test passes, but no documentation (.adoc) files are created.



      When I try something like this:



      ResultActions resultActions = this.mockMvc.perform(RestDocumentationRequestBuilders.post("/createAccount")
      .contextPath("/account")
      .contentType(TestUtil.APPLICATION_JSON_UTF8)
      .content(TestUtil.convertObjectToJsonBytes(new CreateAccountRequest("testName", "testSurname"))))
      .andExpect(status().isBadRequest())
      .andDo(docs);


      test fails because NestedServletException was thrown caused by BadRequestException, and again there is no documentation created.










      share|improve this question













      I have @ControllerAdvice annotated class, which is handling BadRequestException extends RuntimeException exception.



      Now suppose that I have endpoint:



      @PostMapping(value = "/createAccount")
      public ResponseEntity<CreateAccountResponse> createAccount(@RequestBody @Valid CreateAccountRequest createAccountRequest) ...


      In case of unwanted scenario, endpoint throws BadRequestException (with HTTP Status 400) which constructs error JSON object as following:



       
      "errorCode": 123,
      "errorMessage: "Failure reason"



      Is there any way to document case like this using Spring REST Docs ?



      This is example of my approach:



      @Test
      public void createAccountFailExample()

      RestDocumentationResultHandler docs = document("create-acc-fail-example",
      responseFields(
      fieldWithPath("errorCode").type("Integer").description("Error code"),
      fieldWithPath("errorMessage").type("String").description("Error message")
      )
      );

      org.assertj.core.api.Assertions.assertThatThrownBy(() -> this.mockMvc.perform(RestDocumentationRequestBuilders.post("/createAccount")
      .contextPath("/account")
      .contentType(TestUtil.APPLICATION_JSON_UTF8)
      .content(TestUtil.convertObjectToJsonBytes(new CreateAccountRequest("nameTest", "surnameTest"))))
      .andExpect(status().isBadRequest())
      .andDo(docs)).hasCause(new BadRequestException(ServiceError.SOME_FAIL_REASON));



      In this case test passes, but no documentation (.adoc) files are created.



      When I try something like this:



      ResultActions resultActions = this.mockMvc.perform(RestDocumentationRequestBuilders.post("/createAccount")
      .contextPath("/account")
      .contentType(TestUtil.APPLICATION_JSON_UTF8)
      .content(TestUtil.convertObjectToJsonBytes(new CreateAccountRequest("testName", "testSurname"))))
      .andExpect(status().isBadRequest())
      .andDo(docs);


      test fails because NestedServletException was thrown caused by BadRequestException, and again there is no documentation created.







      java spring testing documentation spring-restdocs






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 10 at 13:13









      hideburn

      85112




      85112






















          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          I managed to solve the problem following this answer. When exception handler is defined for MockMvc, my second approach works as expected.






          share|improve this answer




















            Your Answer






            StackExchange.ifUsing("editor", function ()
            StackExchange.using("externalEditor", function ()
            StackExchange.using("snippets", function ()
            StackExchange.snippets.init();
            );
            );
            , "code-snippets");

            StackExchange.ready(function()
            var channelOptions =
            tags: "".split(" "),
            id: "1"
            ;
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function()
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled)
            StackExchange.using("snippets", function()
            createEditor();
            );

            else
            createEditor();

            );

            function createEditor()
            StackExchange.prepareEditor(
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader:
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            ,
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            );



            );













             

            draft saved


            draft discarded


















            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53239293%2fhow-to-document-controlleradvice-handled-exception-using-spring-rest-docs%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            0
            down vote













            I managed to solve the problem following this answer. When exception handler is defined for MockMvc, my second approach works as expected.






            share|improve this answer
























              up vote
              0
              down vote













              I managed to solve the problem following this answer. When exception handler is defined for MockMvc, my second approach works as expected.






              share|improve this answer






















                up vote
                0
                down vote










                up vote
                0
                down vote









                I managed to solve the problem following this answer. When exception handler is defined for MockMvc, my second approach works as expected.






                share|improve this answer












                I managed to solve the problem following this answer. When exception handler is defined for MockMvc, my second approach works as expected.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 11 at 13:57









                hideburn

                85112




                85112



























                     

                    draft saved


                    draft discarded















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53239293%2fhow-to-document-controlleradvice-handled-exception-using-spring-rest-docs%23new-answer', 'question_page');

                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    這個網誌中的熱門文章

                    Barbados

                    How to read a connectionString WITH PROVIDER in .NET Core?

                    Node.js Script on GitHub Pages or Amazon S3