Zuul фильтр ошибок перезаписывается после - PullRequest
0 голосов
/ 16 апреля 2019

Я хочу установить тело ответа на сообщение об исключении, тело ответа всегда пусто. Тело ответа хорошее в конце фильтра, но впоследствии уничтожается. Проблема в каком-то другом фильтре zuul, или мне чего-то не хватает? У меня есть следующий ZullErrorFilter

@Component
public class ErrorFilter extends ZuulFilter {
    private static final Logger LOG = LoggerFactory.getLogger(ErrorFilter.class);
    private static final String THROWABLE_KEY = "throwable";
    private static final int FILTER_ORDER = -1;

    @Override
    public String filterType() {
        return ERROR_TYPE;
    }

    @Override
    public int filterOrder() {
        return FILTER_ORDER;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }


    @Override
    public Object run() {
        final RequestContext context = RequestContext.getCurrentContext();
        final Object throwable = context.get(THROWABLE_KEY);

        if (throwable instanceof ZuulException) {
            final ZuulException zuulException = (ZuulException) throwable;
            Throwable cause = zuulException.getCause();
            LOG.error("Zuul failure detected: " + cause.getMessage());

            // remove error code to prevent further error handling in follow up filters
            context.remove(THROWABLE_KEY);
            System.out.println(cause.getMessage());
            context.setResponseBody(cause.getMessage());
            context.getResponse().setContentType("application/json");
            System.out.println(context.getResponseBody());

            if (causeIsIOError(cause)) {
                context.setResponseStatusCode(409);
            } else if (causeIsAuthorizationError(cause)) {
                context.setResponseStatusCode(401);
            }
        }
        return null;
    }

    private boolean causeIsIOError(Throwable cause) {
        return cause instanceof InvalidTokenPayloadException
                || cause instanceof InvalidResponseBodyException;
    }

    public boolean causeIsAuthorizationError(Throwable cause) {
        return cause instanceof InvalidJWTTokenException ||
                cause instanceof NoPermissionForResourceException ||
                cause instanceof MissingAuthorizationHeaderException;
    }

}

И активны следующие фильтры Zuul:

{
    "error": [
        {
            "class": "org.springframework.cloud.netflix.zuul.filters.post.SendErrorFilter",
            "order": 0,
            "disabled": false,
            "static": true
        },
        {
            "class": "com.example.security.auth.filters.ErrorFilter",
            "order": -1,
            "disabled": false,
            "static": true
        }
    ],
    "post": [
        {
            "class": "com.example.security.auth.filters.JwtPostFilter",
            "order": 999,
            "disabled": false,
            "static": true
        },
        {
            "class": "org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter",
            "order": 1000,
            "disabled": false,
            "static": true
        }
    ],
    "pre": [
        {
            "class": "com.example.security.auth.filters.JwtPreFilter",
            "order": 4,
            "disabled": false,
            "static": true
        },
        {
            "class": "org.springframework.cloud.netflix.zuul.filters.pre.Servlet30WrapperFilter",
            "order": -2,
            "disabled": false,
            "static": true
        },
        {
            "class": "org.springframework.cloud.netflix.zuul.filters.pre.ServletDetectionFilter",
            "order": -3,
            "disabled": false,
            "static": true
        },
        {
            "class": "org.springframework.cloud.netflix.zuul.filters.pre.PreDecorationFilter",
            "order": 5,
            "disabled": false,
            "static": true
        },
        {
            "class": "org.springframework.cloud.netflix.zuul.filters.pre.DebugFilter",
            "order": 1,
            "disabled": false,
            "static": true
        },
        {
            "class": "org.springframework.cloud.netflix.zuul.filters.pre.FormBodyWrapperFilter",
            "order": -1,
            "disabled": false,
            "static": true
        }
    ],
    "route": [
        {
            "class": "org.springframework.cloud.netflix.zuul.filters.route.SimpleHostRoutingFilter",
            "order": 100,
            "disabled": false,
            "static": true
        },
        {
            "class": "org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter",
            "order": 10,
            "disabled": false,
            "static": true
        },
        {
            "class": "org.springframework.cloud.netflix.zuul.filters.route.SendForwardFilter",
            "order": 500,
            "disabled": false,
            "static": true
        }
    ]
}

Edit: Удалена эта строка:

    context.remove(THROWABLE_KEY);

Теперь с телом все в порядке, но исключения обрабатываются некорректно. Это просто выбросить ZuulFilterExceptions в ответе. И код состояния всегда 500.

...