Spring Boot + Cloud | Zuul Proxy | 404 Error

15,203

There is no mapping for "/list" on the resource server (so it's a 404). You either need to set stripPrefix=false on your route declaration, or change the request mapping on the backend to "/".

Share:
15,203

Related videos on Youtube

Kumar Sambhav
Author by

Kumar Sambhav

Software developer using Java, Spring(Boot, MVC, Security, Integration, Batch, Reactive), Kotlin, Kafka, RabbitMQ, Zookeeper, MongoDB, PostgreSQL, AWS (EC2, ECS, ELB, Fargate etc.) AngularJS 1.x, Angular 8, Twitter Bootstrap, Angular Material.

Updated on June 06, 2022

Comments

  • Kumar Sambhav
    Kumar Sambhav about 2 years

    I am using Spring Cloud and Zuul proxy as gateway to my RESTful service.

    Gateway Application (Spring Boot web app running on port 8080) relevant code:-

    Main class:-

    @SpringBootApplication
    @EnableZuulProxy
    public class WebfrontApplication extends WebMvcConfigurerAdapter {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            SpringApplication.run(WebfrontApplication.class, args);
        }
    }
    

    Zuul Mappings:-

    zuul:
      routes:
        customer:
          path: /customer/**
          url: http://localhost:9000/
    

    During startup of above UI Gateway application, I can see in my logs that mappings for proxies are registered:-

    o.s.c.n.zuul.web.ZuulHandlerMapping      : Mapped URL path [/customer/**] onto handler of type [class org.springframework.cloud.netflix.zuul.web.ZuulController]
    

    The REST service (A Spring Boot web app running on port 9000) relevant code:-

    @RestController
    @RequestMapping(value = "/customer")
    public class CustomerController {
    
        @Autowired
        private CustomerService customerService;
    
        /**
         * Get List of All customers.
         * 
         * @return
         */
        @RequestMapping(value = "/list", method = RequestMethod.GET)
        public List<Customer> list(Principal principal) {
            return customerService.list();
        }
    }
    

    Using a rest client (POSTMAN in my case) I am able to get response from above endpoint successfully (after taking care of auth token).

    I am using AngularJS for in UI application to get data from the REST endpoint.

    Relevant code:-

    angular.module('customerModule').factory('customerService',function($http) {
    
        return {
            customerList : function(){
                // PROBLEM !!!!!
                // THIS CALL GIVES A 404 ERROR
                return $http.get('/customer/list');
            }
        };
    });
    

    The above call is giving back a 404 error:- This is what my Chrome debugger shows:-

    Remote Address:127.0.0.1:8080
    Request URL:http://localhost:8080/customer/list
    Request Method:GET
    Status Code:404 Not Found
    

    Request Headers:-

    Accept:application/json, text/plain, */*
    Accept-Encoding:gzip, deflate, sdch
    Accept-Language:en-US,en;q=0.8,hi;q=0.6,ms;q=0.4
    Cache-Control:no-cache
    Connection:keep-alive
    Cookie:SESSION=2e1ac330-fe41-4ff4-8efb-81eaec12c8d1
    Host:localhost:8080
    Pragma:no-cache
    Referer:http://localhost:8080/
    User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36
    X-Auth-Token:2e1ac330-fe41-4ff4-8efb-81eaec12c8d1
    

    Response Headers:-

    Cache-Control:no-cache, no-store, max-age=0, must-revalidate
    Content-Type:application/json; charset=UTF-8
    Date:Fri, 20 Mar 2015 04:00:36 GMT
    Date:Fri, 20 Mar 2015 04:00:36 GMT
    Expires:0
    Pragma:no-cache
    Pragma:no-cache
    Server:Jetty(9.2.9.v20150224)
    Transfer-Encoding:chunked
    X-Application-Context:bootstrap
    X-Content-Type-Options:nosniff
    X-Content-Type-Options:nosniff
    X-Frame-Options:DENY
    X-Frame-Options:DENY
    X-XSS-Protection:1; mode=block
    X-XSS-Protection:1; mode=block
    

    What's is wrong here ? Are mappings incorrect or am I missing something else?

    SOLVED

    As per the accepted answer, changing the Zuul mapping worked when changed to:-

    zuul:
     routes:
      resource:
       path: /customer/**
       url: http://localhost:9000/
       stripPrefix: false
    
  • cst1992
    cst1992 about 8 years
    I'm having a similar problem. Only in my case, it gives me a 405(Not Allowed) when POSTing, but GET works fine. Could you help with this?