Spring 使用 RewritePath 刷新云网关失败
Spring cloud gateway refresh with RewritePath fails
我是 运行 一个依赖 spring 云配置服务器的 spring 云网关实例。我的应用程序以给定的以下配置启动。
cloud:
gateway:
routes:
- id: route-foo
uri: lb://foo
predicates:
- Path=/api/foo/**
filters:
- name: RewritePath
args:
regexp: "/api/foo/(?<remaining>.*)"
replacement: "/${remaining}"
假设我修改了我的配置并在下面添加了一条额外的路由
- id: route-bar
uri: lb://bar
predicates:
- Path=/api/bar/**
filters:
- name: RewritePath
args:
regexp: "/api/bar/(?<remaining>.*)"
replacement: "/${remaining}"
执行一个POST到http://localhost:8080/actuator/refresh
returns下面的错误。
500 Server Error for HTTP POST "/actuator/refresh" (Encoded)
java.lang.IllegalArgumentException: Could not resolve placeholder 'remaining' in value "/${remaining}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:178)
看来 spring 正在尝试解析我的 RewritePath 替换并将其替换为环境变量。我有哪些选择?
您 运行 正在 spring 尝试替换配置中的变量。
有两种解法
转义替换语法(首选)
改变replacement: "/${remaining}"
到replacement: "/$\{remaining}"
RewriteGatewayFilterFactory 对 运行 过滤器之前的配置进行了替换。
启用 ignoreUnresolvableNestedPlaceholders
@Bean
@Primary
public StandardReactiveWebEnvironment standardReactiveWebEnvironmentCustomizer(StandardReactiveWebEnvironment environment) {
environment.setIgnoreUnresolvableNestedPlaceholders(true);
return environment;
}
这将使所有无法解析的占位符单独保留在您的配置中,并且在刷新期间不会失败。我建议不要使用这种方法,因为如果您依赖正确填充的字段,它最终可能会将一些问题延迟到运行时。
理论上,您应该能够使用 PropertySourcesPlaceholderConfigurer 完成相同的功能,我很难让它配合。
我是 运行 一个依赖 spring 云配置服务器的 spring 云网关实例。我的应用程序以给定的以下配置启动。
cloud:
gateway:
routes:
- id: route-foo
uri: lb://foo
predicates:
- Path=/api/foo/**
filters:
- name: RewritePath
args:
regexp: "/api/foo/(?<remaining>.*)"
replacement: "/${remaining}"
假设我修改了我的配置并在下面添加了一条额外的路由
- id: route-bar
uri: lb://bar
predicates:
- Path=/api/bar/**
filters:
- name: RewritePath
args:
regexp: "/api/bar/(?<remaining>.*)"
replacement: "/${remaining}"
执行一个POST到http://localhost:8080/actuator/refresh
returns下面的错误。
500 Server Error for HTTP POST "/actuator/refresh" (Encoded)
java.lang.IllegalArgumentException: Could not resolve placeholder 'remaining' in value "/${remaining}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:178)
看来 spring 正在尝试解析我的 RewritePath 替换并将其替换为环境变量。我有哪些选择?
您 运行 正在 spring 尝试替换配置中的变量。
有两种解法
转义替换语法(首选)
改变replacement: "/${remaining}"
到replacement: "/$\{remaining}"
RewriteGatewayFilterFactory 对 运行 过滤器之前的配置进行了替换。
启用 ignoreUnresolvableNestedPlaceholders
@Bean
@Primary
public StandardReactiveWebEnvironment standardReactiveWebEnvironmentCustomizer(StandardReactiveWebEnvironment environment) {
environment.setIgnoreUnresolvableNestedPlaceholders(true);
return environment;
}
这将使所有无法解析的占位符单独保留在您的配置中,并且在刷新期间不会失败。我建议不要使用这种方法,因为如果您依赖正确填充的字段,它最终可能会将一些问题延迟到运行时。
理论上,您应该能够使用 PropertySourcesPlaceholderConfigurer 完成相同的功能,我很难让它配合。