У меня есть это Java приложение с шиповником, где я хотел перехватить все необработанные исключения.
Я хотел ответить 500 вместо страницы ошибок по умолчанию, которую дает JAXRS, поэтому я просто использовал реализацию ExceptionMapper<Throwable>
.
Провел тестирование с использованием Postman без проблем, но как только я попытался сделать вызов AJAX в браузере, я закончил посылкой запроса OPTIONS, который не выполняется.
Также реализована часть CORS на стороне приложения путем реализации ContainerResponseFilter
.
У меня такое ощущение, что СООТВЕТСТВИЕ происходит на ранней стадии запроса, и только позже CORSFilter влияет на ответ.
Мало что я уже пробовал:
- @ PreMatching
- @ Priority
- Пытался импортировать jboss.resteasy CorsFilter
- Пытался отфильтровать исключения по
exception instanceof DefaultOptionsMethodException
, но в итоге выяснил, что DefaultOptionsMethodException
отсутствует в classpath, и его внутренний (?) пакет включен в thorntails classpath (??) - ...
// CORSFilter
package com.testapplication.test.rest;
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;
@Provider
public class CORSFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
responseContext.getHeaders().add("Access-Control-Max-Age", "-1");
responseContext.getHeaders().add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
}
}
// UncaughtExceptionMapper
package com.testapplication.test.rest;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
@Provider
public class UncaughtExceptionMapper extends Throwable implements ExceptionMapper<Throwable> {
@Override
public Response toResponse(Throwable exception) {
exception.printStackTrace();
return Response.status(500).entity("{\"message\": \"a\"}").build();
}
}
Пример репозитория: https://github.com/trimpirim/cors-filter-conflict-exception-mapper