java - 为什么 CORSFilter 与 ExceptionMapper<Throwable> 冲突?

标签 java jax-rs thorntail exceptionmapper

我有这个 Java Thorntail 应用程序,我想在其中捕获所有未捕获的异常。

我想用 500 来响应,而不是 JAXRS 提供的默认错误页面,所以我只使用 ExceptionMapper<Throwable> 的实现。

使用 Postman 进行测试没有问题,但是当我尝试在浏览器中进行 AJAX 调用时,我最终发送了 OPTIONS 请求,该请求失败了。

CORS部分也在应用程序端通过实现ContainerResponseFilter来实现。

我有一种感觉,MATCHING 发生在请求的早期阶段,只有在稍后 CORSFilter 才会对响应产生影响。

我已经尝试过的一些事情:

  • @PreMatching
  • @优先级
  • 尝试导入 jboss.resteasy CorsFilter
  • 尝试通过 exception instanceof DefaultOptionsMethodException 过滤掉异常情况,但最终发现DefaultOptionsMethodException不在类路径中,它是包含在thorntails类路径中的内部(?)包(?)
  • ...
// 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

最佳答案

尝试使用 this post 底部的过滤器。仅使用响应过滤器无法正确执行 CORS 交互。您还需要一个请求过滤器来中止预检请求。

关于java - 为什么 CORSFilter 与 ExceptionMapper<Throwable> 冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59994531/

相关文章:

java - 获取文件的目录

java - JAX-RS:使用 JSON 数组的 PUT/POST 不会反序列化为类型化列表

从 java 8 迁移到 java 11 时出现 JPA/eclipselink 错误

maven - Thorntail没有运行以进行集成测试,但是我有一个正在运行的项目相同的pom.xml

Java Swing 应用程序 JList null 异常

java - Runtime.Freememory() 在两个连续调用之间初始化数组时返回变量值?

java - 如何在java中获取给定月份和年份的最后一个日期

json - 从 JSON 结果中删除类型信息

java - 使用 jersey 的 JAXB 解码失败