发现有个服务快应用过来的请求突然都404(no mapping found )了,但是自己用postman/curl调用或者浏览器都正常
开始怀疑是url中有乱码,加了个Filter, 这个是正常的,参数什么的也正常,按理是一样的
最后实在没招了,想到可能是Header的问题,如果打印出所有的Header,对比快应用与postman的请求
请求头Accept跟请求消息体Content-type居然都是application/x-protobuf,
而自己的@RequestMapping又设置了produces="application/json"
这个确实不应该,其他服务都是走的pb协议,这个服务是普通的web服务走的json, 确认不是客户端加的,那是哪里,想到了网关,果不奇然,网关Accept/Content-type都是application/x-protobuf
两边匹配不上,
顺便翻了下spring的内容协商机制代码,这块是在AbstractMessageConverterMethodProcessor的writeWithMessageConverters中处理的
} else {
HttpServletRequest request = inputMessage.getServletRequest();
//客户端可接受的
List<MediaType> acceptableTypes = this.getAcceptableMediaTypes(request);
//服务端所能提供的
List<MediaType> producibleTypes = this.getProducibleMediaTypes(request, valueType, (Type)targetType);
if (body != null && producibleTypes.isEmpty()) {
throw new HttpMessageNotWritableException("No converter found for return value of type: " + valueType);
}
List<MediaType> mediaTypesToUse = new ArrayList();
Iterator var15 = acceptableTypes.iterator();
MediaType mediaType;
while(var15.hasNext()) {
mediaType = (MediaType)var15.next();
Iterator var17 = producibleTypes.iterator();
while(var17.hasNext()) {
MediaType producibleType = (MediaType)var17.next();
if (mediaType.isCompatibleWith(producibleType)) {
mediaTypesToUse.add(this.getMostSpecificMediaType(mediaType, producibleType));
}
}
}
if (mediaTypesToUse.isEmpty()) {
if (body != null) {
throw new HttpMediaTypeNotAcceptableException(producibleTypes);
}
if (this.logger.isDebugEnabled()) {
this.logger.debug("No match for " + acceptableTypes + ", supported: " + producibleTypes);
}
return;
}
MediaType.sortBySpecificityAndQuality(mediaTypesToUse);
var15 = mediaTypesToUse.iterator();
while(var15.hasNext()) {
mediaType = (MediaType)var15.next();
if (mediaType.isConcrete()) {
selectedMediaType = mediaType;
break;
}
if (mediaType.isPresentIn(ALL_APPLICATION_MEDIA_TYPES)) {
selectedMediaType = MediaType.APPLICATION_OCTET_STREAM;
break;
}
}
if (this.logger.isDebugEnabled()) {
this.logger.debug("Using '" + selectedMediaType + "', given " + acceptableTypes + " and supported " + producibleTypes);
}
}