Jersey开发问题:WADL处理JAXBContext创建失败及Angular5跨域报错
解决Jersey REST API的跨域认证问题与WADL/JAXBContext错误
嘿,我之前刚好踩过类似的坑,咱们一步步来搞定这两个问题:
一、Angular 5调用的CORS跨域错误
你在Paw里能正常请求但Angular报错,核心原因是浏览器的预检请求(OPTIONS)没被服务器正确处理——Paw这类API工具不会触发浏览器的同源策略检查,但Angular在发送带凭证的POST请求前,会自动发一个OPTIONS预检请求,确认服务器允许跨域。
解决方案:给Jersey添加CORS过滤器
在Jersey里实现一个ContainerResponseFilter来处理跨域头,直接上代码:
import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.Provider; @Provider public class CorsFilter implements ContainerResponseFilter { @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) { MultivaluedMap<String, Object> headers = responseContext.getHeaders(); // 允许你的Angular前端域名,比如http://localhost:4200,生产环境别用* headers.add("Access-Control-Allow-Origin", "http://localhost:4200"); // 必须开启这个,因为你的API需要携带凭证 headers.add("Access-Control-Allow-Credentials", "true"); // 允许的HTTP方法,按需调整 headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); // 允许的请求头,比如包含认证相关的字段 headers.add("Access-Control-Allow-Headers", "Content-Type, Authorization, X-Requested-With"); // 处理预检的OPTIONS请求,直接返回200即可 if (requestContext.getMethod().equals("OPTIONS")) { responseContext.setStatus(200); } } }
然后把这个过滤器注册到你的Jersey配置类里:
public class JerseyConfig extends ResourceConfig { public JerseyConfig() { // 注册你的API资源包 packages("com.your.package.resources"); // 注册CORS过滤器 register(CorsFilter.class); } }
另外,Angular请求里记得开启withCredentials:
this.http.post('http://localhost:8080/login', credentials, { withCredentials: true }) .subscribe(...);
二、Jersey处理WADL时创建JAXBContext失败
这个错误通常是Jersey生成WADL文档时,需要JAXB序列化API元数据,但缺少依赖或者实体类配置有问题。
解决方案有两种:
1. 添加JAXB依赖(推荐)
如果是Maven项目,在pom.xml里加以下依赖(适配Jersey 2.x和Java 8+):
<dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.1</version> <scope>runtime</scope> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency>
Java 9及以上还需要额外加:
<dependency> <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> </dependency>
2. 直接禁用WADL生成(简单粗暴)
如果你不需要WADL文档,可以直接在Jersey配置里关掉它:
public class JerseyConfig extends ResourceConfig { public JerseyConfig() { packages("com.your.package.resources"); register(CorsFilter.class); // 禁用WADL生成,避免JAXBContext错误 property(FeaturesAndProperties.FEATURE_DISABLE_WADL, true); } }
这样应该就能解决你遇到的两个问题了,试试看!
内容的提问来源于stack exchange,提问作者jrmybeaud
相关产品推荐
相关产品推荐

