Spring gateway异常处理统一格式化

在spring cloud中gateway的异常捕获处理相比spring boot略有所不同,spring gateway使用netty做http server。

需要说明一点,这里所说的异常捕获是指捕获发生在gateway应用中的异常,而非后端应用中出现的异常,因为,后端应用中的异常一般都能被应用有效捕获和处理,当回传到gateway时只能算是一种数据而非异常,当然,如果后端应用出现500或401之类的异常时,gateway将有机会感知到。

Spring gateway对自身发生的异常,通常都以json格式输出,有时可能希望调整一下json的格式,对于这种需求还是比较容易满足的。

声明配置

@Configuration()
public class ErrorConfiguration {

	@Bean
	@ConditionalOnMissingBean(value = ErrorAttributes.class, search = SearchStrategy.CURRENT)
	public DefaultErrorAttributes errorAttributes() {
		return new WebErrorAttributes();
	}
}

异常格式化处理

public class WebErrorAttributes extends DefaultErrorAttributes {

	private static final Logger LOG = LoggerFactory.getLogger(WebErrorAttributes.class);

	@Override
	public Map<String, Object> getErrorAttributes(ServerRequest request, boolean includeStackTrace) {
		Map<String, Object> res = new LinkedHashMap<>();
		Throwable error = getError(request);
		//determineException(error);
		res.put("code", 500);
		res.put("message", "failure");
		res.put("data", Collections.EMPTY_LIST);
		return res;
	}

	private Throwable determineException(Throwable error) {
		if (error instanceof ResponseStatusException) {
			return (error.getCause() != null) ? error.getCause() : error;
		}
		return error;
	}

}

如果需要更多异常信息,参考DefaultErrorAttributes中被覆盖的方法。