From 70c3d9e784135d357b58e9d7d865bb6a1f3ed417 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Sat, 29 Nov 2014 09:29:24 +0000 Subject: [PATCH] Ensure user-suppplied ZuulFilters are added properly Bean instantiation ordering was causing external (user-supplied) filter beans to replace the defaults, not append to them. Separating out the autowired map of beans into a spearate class was enough to fix it. Fixes gh-78 --- .../cloud/netflix/zuul/ZuulConfiguration.java | 123 +++++++++--------- .../zuul/SampleZuulProxyApplication.java | 25 ++++ .../zuul/SampleZuulProxyApplicationTests.java | 1 + .../src/test/resources/application.yml | 3 + 4 files changed, 93 insertions(+), 59 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java index a811728c..da974490 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java @@ -30,77 +30,82 @@ import com.netflix.zuul.http.ZuulServlet; @ConditionalOnExpression("${zuul.enabled:true}") public class ZuulConfiguration { - @Autowired(required=false) - private TraceRepository traces; + @Autowired(required = false) + private TraceRepository traces; - @Autowired - private DiscoveryClient discovery; + @Autowired + private DiscoveryClient discovery; - @Autowired - private ZuulProperties zuulProperties; + @Autowired + private ZuulProperties zuulProperties; - @Autowired - private Map filters; + @Bean + public RouteLocator routes() { + return new RouteLocator(discovery, zuulProperties); + } - @Bean - public RouteLocator routes(){ - return new RouteLocator(discovery, zuulProperties); - } + @Bean + public ZuulController zuulController() { + return new ZuulController(); + } - @Bean - public ZuulController zuulController() { - return new ZuulController(); - } + @Bean + public ZuulHandlerMapping zuulHandlerMapping() { + return new ZuulHandlerMapping(routes(), zuulController(), zuulProperties); + } - @Bean - public ZuulHandlerMapping zuulHandlerMapping() { - return new ZuulHandlerMapping(routes(), zuulController(), zuulProperties); - } + @Configuration + protected static class ZuulFilterConfiguration { - @Bean - public FilterInitializer zuulFilterInitializer() { - return new FilterInitializer(filters); - } + @Autowired + private Map filters; - // pre filters - @Bean - public DebugFilter debugFilter() { - return new DebugFilter(); - } + @Bean + public FilterInitializer zuulFilterInitializer() { + return new FilterInitializer(filters); + } - @Bean - public PreDecorationFilter preDecorationFilter() { - return new PreDecorationFilter(routes(), zuulProperties); - } + } - @Bean - public Servlet30WrapperFilter servlet30WrapperFilter() { - return new Servlet30WrapperFilter(); - } + // pre filters + @Bean + public DebugFilter debugFilter() { + return new DebugFilter(); + } - // route filters - @Bean - public RibbonRoutingFilter ribbonRoutingFilter() { - RibbonRoutingFilter filter = new RibbonRoutingFilter(); - if (traces!=null) { - filter.setTraces(traces); - } - return filter; - } + @Bean + public PreDecorationFilter preDecorationFilter() { + return new PreDecorationFilter(routes(), zuulProperties); + } - @Bean - public SimpleHostRoutingFilter simpleHostRoutingFilter() { - return new SimpleHostRoutingFilter(); - } + @Bean + public Servlet30WrapperFilter servlet30WrapperFilter() { + return new Servlet30WrapperFilter(); + } - // post filters - @Bean - public SendResponseFilter sendResponseFilter() { - return new SendResponseFilter(); - } + // route filters + @Bean + public RibbonRoutingFilter ribbonRoutingFilter() { + RibbonRoutingFilter filter = new RibbonRoutingFilter(); + if (traces != null) { + filter.setTraces(traces); + } + return filter; + } - @Bean - public SendErrorFilter sendErrorFilter() { - return new SendErrorFilter(); - } + @Bean + public SimpleHostRoutingFilter simpleHostRoutingFilter() { + return new SimpleHostRoutingFilter(); + } + + // post filters + @Bean + public SendResponseFilter sendResponseFilter() { + return new SendResponseFilter(); + } + + @Bean + public SendErrorFilter sendErrorFilter() { + return new SendErrorFilter(); + } } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplication.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplication.java index e9ac0ede..82d8a94a 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplication.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplication.java @@ -3,10 +3,13 @@ package org.springframework.cloud.netflix.zuul; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import com.netflix.zuul.ZuulFilter; + @SpringBootApplication @RestController @EnableZuulProxy @@ -38,6 +41,28 @@ public class SampleZuulProxyApplication { return "Hello world"; } + @Bean + public ZuulFilter sampleFilter() { + return new ZuulFilter() { + @Override + public String filterType() { + return "pre"; + } + @Override + public boolean shouldFilter() { + return true; + } + @Override + public Object run() { + return null; + } + @Override + public int filterOrder() { + return 0; + } + }; + } + public static void main(String[] args) { SpringApplication.run(SampleZuulProxyApplication.class, args); } diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplicationTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplicationTests.java index 1a0b29da..46c4a82e 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplicationTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/SampleZuulProxyApplicationTests.java @@ -38,6 +38,7 @@ public class SampleZuulProxyApplicationTests { ResponseEntity result = new TestRestTemplate().exchange("http://localhost:" + port + "/self/1", HttpMethod.DELETE, new HttpEntity((Void) null), String.class); assertEquals(HttpStatus.OK, result.getStatusCode()); + assertEquals("Deleted!", result.getBody()); } } diff --git a/spring-cloud-netflix-core/src/test/resources/application.yml b/spring-cloud-netflix-core/src/test/resources/application.yml index 50365afe..f8f7260f 100644 --- a/spring-cloud-netflix-core/src/test/resources/application.yml +++ b/spring-cloud-netflix-core/src/test/resources/application.yml @@ -6,6 +6,9 @@ spring: eureka: server: enabled: false + client: + registerWithEureka: false + fetchRegistry: false #error: # path: /myerror management: