Camel REST DSL配置Content-Type校验统一返回415状态码方案
解决方案
你遇到的两个异常场景都是Camel Netty HTTP组件的默认行为导致的,可通过以下配置修复,实现所有非application/json类型的请求统一返回415状态码:
1. 拦截无Content-Type请求
Camel REST客户端校验默认允许不带Content-Type头的请求通过,你需要在restConfiguration中添加allowNoContentType(false)配置,关闭该默认行为:
restConfiguration() .component("netty-http") .port(8081) .bindingMode(RestBindingMode.json) .clientRequestValidation(true) .skipBindingOnErrorCode(true) // 新增配置:不允许无Content-Type头的请求通过校验 .allowNoContentType(false);
配置完成后,省略Content-Type头的请求会直接被校验逻辑拦截,返回415状态码,不会进入后续路由流程。
2. 处理application/x-www-form-urlencoded请求提前报错问题
该异常是因为Netty HTTP组件在请求进入REST校验逻辑之前,会自动尝试解析application/x-www-form-urlencoded类型的请求体为表单键值对,遇到JSON格式的内容就会抛出非法参数异常,直接断开连接。可通过自定义HTTP绑定组件跳过非JSON类型的表单解析逻辑,让请求正常进入REST校验层:
restConfiguration() .component("netty-http") .port(8081) .bindingMode(RestBindingMode.json) .clientRequestValidation(true) .skipBindingOnErrorCode(true) .allowNoContentType(false) // 新增自定义HTTP绑定,跳过非JSON类型的表单解析 .componentProperty("httpBinding", new RestNettyHttpBinding() { @Override public void populateCamelHeaders(NettyHttpMessage message, Map<String, Object> headers, Exchange exchange, NettyHttpConfiguration configuration) throws Exception { String contentType = message.getHttpRequest().headers().get(HttpHeaderNames.CONTENT_TYPE); // 仅对JSON类型的请求执行默认解析逻辑,其他类型跳过表单解析,直接进入REST校验 if (contentType != null && contentType.contains(MediaType.APPLICATION_JSON_VALUE)) { super.populateCamelHeaders(message, headers, exchange, configuration); } } });
如果不想自定义HTTP绑定,也可以通过全局异常处理器捕获该类异常,统一返回415状态码:
// 全局异常处理,放在路由配置最前面 onException(IllegalArgumentException.class) .handled(true) .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(415)) .setBody(constant(""));
完整校验效果
完成上述配置后,以下三类请求都会统一返回415 Unsupported Media Type:
- Content-Type为text/plain等非JSON类型的请求
- 缺失Content-Type头的请求
- Content-Type为application/x-www-form-urlencoded的请求
内容的提问来源于stack exchange,提问作者ankush
相关产品推荐
相关产品推荐

