How to customize Spring boot controller API response for ZuulException










0














We are using Zuul, Eureka and spring boot application services for REST APIs.



Suppose my spring boot service is down and when I tried to access the API using Zuul API gateway, I am getting ZuulException and response is below :




"timestamp": "2018-10-12T14:29:09.632+0000",
"status": 500,
"error": "Internal Server Error",
"exception": "com.netflix.zuul.exception.ZuulException",
"message": "GENERAL"



I want to customize the response format like below:




"success": false,
"message": "Service is down. Please try later"



I tried to implement https://stackoverflow.com/a/39841785/5506061 but its not working for me.



Please suggest how to customize the response for ZuulException.










share|improve this question


























    0














    We are using Zuul, Eureka and spring boot application services for REST APIs.



    Suppose my spring boot service is down and when I tried to access the API using Zuul API gateway, I am getting ZuulException and response is below :




    "timestamp": "2018-10-12T14:29:09.632+0000",
    "status": 500,
    "error": "Internal Server Error",
    "exception": "com.netflix.zuul.exception.ZuulException",
    "message": "GENERAL"



    I want to customize the response format like below:




    "success": false,
    "message": "Service is down. Please try later"



    I tried to implement https://stackoverflow.com/a/39841785/5506061 but its not working for me.



    Please suggest how to customize the response for ZuulException.










    share|improve this question
























      0












      0








      0







      We are using Zuul, Eureka and spring boot application services for REST APIs.



      Suppose my spring boot service is down and when I tried to access the API using Zuul API gateway, I am getting ZuulException and response is below :




      "timestamp": "2018-10-12T14:29:09.632+0000",
      "status": 500,
      "error": "Internal Server Error",
      "exception": "com.netflix.zuul.exception.ZuulException",
      "message": "GENERAL"



      I want to customize the response format like below:




      "success": false,
      "message": "Service is down. Please try later"



      I tried to implement https://stackoverflow.com/a/39841785/5506061 but its not working for me.



      Please suggest how to customize the response for ZuulException.










      share|improve this question













      We are using Zuul, Eureka and spring boot application services for REST APIs.



      Suppose my spring boot service is down and when I tried to access the API using Zuul API gateway, I am getting ZuulException and response is below :




      "timestamp": "2018-10-12T14:29:09.632+0000",
      "status": 500,
      "error": "Internal Server Error",
      "exception": "com.netflix.zuul.exception.ZuulException",
      "message": "GENERAL"



      I want to customize the response format like below:




      "success": false,
      "message": "Service is down. Please try later"



      I tried to implement https://stackoverflow.com/a/39841785/5506061 but its not working for me.



      Please suggest how to customize the response for ZuulException.







      spring-boot netflix-zuul






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 12 at 13:18









      Krish

      2602316




      2602316






















          1 Answer
          1






          active

          oldest

          votes


















          0














          You can implement your own FallbackProvider and customize the response based on the cause if needed.



          Something like :



          @Component
          public class CustomFallbackBasedOnCause implements FallbackProvider

          private static final String DEFAULT_MSG = ""success": false,"message": "Service is down. Please try later"";

          @Override
          public String getRoute()
          return "*"; // * = all routes


          @Override
          public ClientHttpResponse fallbackResponse(final Throwable cause)
          if (cause instanceof HystrixTimeoutException)
          return response(HttpStatus.GATEWAY_TIMEOUT);
          else
          return fallbackResponse();



          @Override
          public ClientHttpResponse fallbackResponse()
          return response(HttpStatus.INTERNAL_SERVER_ERROR);


          private ClientHttpResponse response(final HttpStatus status)
          return new ClientHttpResponse()
          @Override
          public HttpStatus getStatusCode() throws IOException
          return status;


          @Override
          public int getRawStatusCode() throws IOException
          return status.value();


          @Override
          public String getStatusText() throws IOException
          return status.getReasonPhrase();


          @Override
          public void close()


          @Override
          public InputStream getBody() throws IOException
          return new ByteArrayInputStream(DEFAULT_MSG.getBytes());


          @Override
          public HttpHeaders getHeaders()
          HttpHeaders headers = new HttpHeaders();
          headers.setContentType(MediaType.APPLICATION_JSON);
          return headers;

          ;




          As you can see in the getRoute() method, you can specify if this customFallback will be used for all routes (return "*") or for a specific route.



          In case you work with Registry service (e.g Eureka). You don’t specify the route URL but the service id instead. return "SERVICEID"






          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',
            autoActivateHeartbeat: false,
            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%2f53263029%2fhow-to-customize-spring-boot-controller-api-response-for-zuulexception%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









            0














            You can implement your own FallbackProvider and customize the response based on the cause if needed.



            Something like :



            @Component
            public class CustomFallbackBasedOnCause implements FallbackProvider

            private static final String DEFAULT_MSG = ""success": false,"message": "Service is down. Please try later"";

            @Override
            public String getRoute()
            return "*"; // * = all routes


            @Override
            public ClientHttpResponse fallbackResponse(final Throwable cause)
            if (cause instanceof HystrixTimeoutException)
            return response(HttpStatus.GATEWAY_TIMEOUT);
            else
            return fallbackResponse();



            @Override
            public ClientHttpResponse fallbackResponse()
            return response(HttpStatus.INTERNAL_SERVER_ERROR);


            private ClientHttpResponse response(final HttpStatus status)
            return new ClientHttpResponse()
            @Override
            public HttpStatus getStatusCode() throws IOException
            return status;


            @Override
            public int getRawStatusCode() throws IOException
            return status.value();


            @Override
            public String getStatusText() throws IOException
            return status.getReasonPhrase();


            @Override
            public void close()


            @Override
            public InputStream getBody() throws IOException
            return new ByteArrayInputStream(DEFAULT_MSG.getBytes());


            @Override
            public HttpHeaders getHeaders()
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_JSON);
            return headers;

            ;




            As you can see in the getRoute() method, you can specify if this customFallback will be used for all routes (return "*") or for a specific route.



            In case you work with Registry service (e.g Eureka). You don’t specify the route URL but the service id instead. return "SERVICEID"






            share|improve this answer

























              0














              You can implement your own FallbackProvider and customize the response based on the cause if needed.



              Something like :



              @Component
              public class CustomFallbackBasedOnCause implements FallbackProvider

              private static final String DEFAULT_MSG = ""success": false,"message": "Service is down. Please try later"";

              @Override
              public String getRoute()
              return "*"; // * = all routes


              @Override
              public ClientHttpResponse fallbackResponse(final Throwable cause)
              if (cause instanceof HystrixTimeoutException)
              return response(HttpStatus.GATEWAY_TIMEOUT);
              else
              return fallbackResponse();



              @Override
              public ClientHttpResponse fallbackResponse()
              return response(HttpStatus.INTERNAL_SERVER_ERROR);


              private ClientHttpResponse response(final HttpStatus status)
              return new ClientHttpResponse()
              @Override
              public HttpStatus getStatusCode() throws IOException
              return status;


              @Override
              public int getRawStatusCode() throws IOException
              return status.value();


              @Override
              public String getStatusText() throws IOException
              return status.getReasonPhrase();


              @Override
              public void close()


              @Override
              public InputStream getBody() throws IOException
              return new ByteArrayInputStream(DEFAULT_MSG.getBytes());


              @Override
              public HttpHeaders getHeaders()
              HttpHeaders headers = new HttpHeaders();
              headers.setContentType(MediaType.APPLICATION_JSON);
              return headers;

              ;




              As you can see in the getRoute() method, you can specify if this customFallback will be used for all routes (return "*") or for a specific route.



              In case you work with Registry service (e.g Eureka). You don’t specify the route URL but the service id instead. return "SERVICEID"






              share|improve this answer























                0












                0








                0






                You can implement your own FallbackProvider and customize the response based on the cause if needed.



                Something like :



                @Component
                public class CustomFallbackBasedOnCause implements FallbackProvider

                private static final String DEFAULT_MSG = ""success": false,"message": "Service is down. Please try later"";

                @Override
                public String getRoute()
                return "*"; // * = all routes


                @Override
                public ClientHttpResponse fallbackResponse(final Throwable cause)
                if (cause instanceof HystrixTimeoutException)
                return response(HttpStatus.GATEWAY_TIMEOUT);
                else
                return fallbackResponse();



                @Override
                public ClientHttpResponse fallbackResponse()
                return response(HttpStatus.INTERNAL_SERVER_ERROR);


                private ClientHttpResponse response(final HttpStatus status)
                return new ClientHttpResponse()
                @Override
                public HttpStatus getStatusCode() throws IOException
                return status;


                @Override
                public int getRawStatusCode() throws IOException
                return status.value();


                @Override
                public String getStatusText() throws IOException
                return status.getReasonPhrase();


                @Override
                public void close()


                @Override
                public InputStream getBody() throws IOException
                return new ByteArrayInputStream(DEFAULT_MSG.getBytes());


                @Override
                public HttpHeaders getHeaders()
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;

                ;




                As you can see in the getRoute() method, you can specify if this customFallback will be used for all routes (return "*") or for a specific route.



                In case you work with Registry service (e.g Eureka). You don’t specify the route URL but the service id instead. return "SERVICEID"






                share|improve this answer












                You can implement your own FallbackProvider and customize the response based on the cause if needed.



                Something like :



                @Component
                public class CustomFallbackBasedOnCause implements FallbackProvider

                private static final String DEFAULT_MSG = ""success": false,"message": "Service is down. Please try later"";

                @Override
                public String getRoute()
                return "*"; // * = all routes


                @Override
                public ClientHttpResponse fallbackResponse(final Throwable cause)
                if (cause instanceof HystrixTimeoutException)
                return response(HttpStatus.GATEWAY_TIMEOUT);
                else
                return fallbackResponse();



                @Override
                public ClientHttpResponse fallbackResponse()
                return response(HttpStatus.INTERNAL_SERVER_ERROR);


                private ClientHttpResponse response(final HttpStatus status)
                return new ClientHttpResponse()
                @Override
                public HttpStatus getStatusCode() throws IOException
                return status;


                @Override
                public int getRawStatusCode() throws IOException
                return status.value();


                @Override
                public String getStatusText() throws IOException
                return status.getReasonPhrase();


                @Override
                public void close()


                @Override
                public InputStream getBody() throws IOException
                return new ByteArrayInputStream(DEFAULT_MSG.getBytes());


                @Override
                public HttpHeaders getHeaders()
                HttpHeaders headers = new HttpHeaders();
                headers.setContentType(MediaType.APPLICATION_JSON);
                return headers;

                ;




                As you can see in the getRoute() method, you can specify if this customFallback will be used for all routes (return "*") or for a specific route.



                In case you work with Registry service (e.g Eureka). You don’t specify the route URL but the service id instead. return "SERVICEID"







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 13 at 10:57









                redoff

                453410




                453410



























                    draft saved

                    draft discarded
















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid


                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.

                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function ()
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53263029%2fhow-to-customize-spring-boot-controller-api-response-for-zuulexception%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







                    Popular posts from this blog

                    Top Tejano songwriter Luis Silva dead of heart attack at 64

                    政党

                    天津地下鉄3号線