2016-12-27 97 views
0

我試圖使用過濾器Zuul做動態路由的工作。我有一個在Spring Boot中運行的應用程序。此應用程序公開兩項服務。重定向不與Zuul春季啓動

@PostMapping("/update") 
public String updateBook(Book book) { 
    return " Book Updated"; 
} 
@PostMapping("/add") 
public String addBook(Book book) { 
    return " Book Added"; 
} 

Application.properties這個應用程序是

spring.application.name=book 
server.port=8090 

在我zuul過濾器,我重定向任何要求要麼/或更新/添加基於某種邏輯。

Zuul配置如下。

zuul.routes.books.url=http://localhost:8090 
ribbon.eureka.enabled=false 
server.port=8080 

重定向是使用下面的代碼在一個延伸ZuulFilter

@Override 
public Object run() { 
    RequestContext context = RequestContext.getCurrentContext(); 
    String requestBody = CharStreams.toString(context.getRequest().getReader()); 
    Gson gson = new Gson(); 
    Book book = gson.fromJson(requestBody, Book.class); 

    if (book.getType().equals("update")) { 

     context.setRouteHost(new URL("http://localhost:8090/update")); 
    } 
    else { 
     context.setRouteHost(new URL("http://localhost:8090/add")); 
    } 
    return null; 
} 

當我調用

curl -i -X POST -H "Content-Type:application/json" -d "{\"id\":\"1\", \"name\":\"Book1\", \"type\":\"update\"}" http://localhost:8080/books/add 

我希望它應該重定向到/更新服務的過濾器類來完成在run()因爲類型是作爲更新傳遞的。但是我發現它是被調用的添加服務。 setRouteHost代碼正在執行,但重定向沒有發生。

有什麼我失蹤?任何指針將不勝感激。

謝謝

回答

0

我能夠通過使用下面的代碼得到這個工作。

if (book.getType().equals("update")) { 
    context.setRouteHost(new URL("http://localhost:8090")); 
    context.addOriginResponseHeader("X-Zuul-Service","http://localhost:8090"); 
    context.put("requestURI", "/update"); 
}