我已经将Spring版本从4.0.x升级到4.2.3 (刚才是4.2.4),突然,@RequestBody注释中的"required = false“属性无法正常工作(就像版本更改之前一样)。
服务器对HttpStatus 415的响应-不支持的媒体类型。
控制器方法(对于每个Spring版本都相同)。
@RequestMapping(value = "/entity/{entityId}/{from}/{size}", method = RequestMethod.POST)
@ResponseBody
@JsonView(ToShowIn.App.class)
public ResponseEntity<?> getActiveEntityPaged(
@PathVariable int entityId, @PathVariable int from, @PathVariable int size,
@RequestBody(required = false) EntityFilterParam entityFilterParam) {
...
}实际上,这不是问题,因为从客户端来说,避免发送null,例如,设置空的EntityFilterParam实例就足以修复它。但是我想知道这个烦人的问题是不是因为我的一个错误的概念,或者更确切地说是由于新的Spring版本中的一个bug。
UPDATE#1
版本
<spring-version>4.2.4.RELEASE</spring-version>
<jackson-2-version>2.3.2</jackson-2-version>请求来自安卓设备,使用spring-android库(又名RestTemplate)。
泛型方法,适用于4.0.x版本,其中EntityFilterParam可以为空。
super.doRestList(
new HttpEntity<EntityFilterParam>(EntityFilterParam, this.getHttpHeaders()),
HttpMethod.POST,
urlBuilder);在4.2.3和4.2.4中,为了解决这个问题,EntityFilterParam不能为空。-> HttpStatus 415 -不支持的媒体类型。来解决这个问题。
super.doRestList(
new HttpEntity<EntityFilterParam>((EntityFilterParam != null) ? EntityFilterParam : new EntityFilterParam(), this.getHttpHeaders()),
HttpMethod.POST,
urlBuilder);在doRestList内部,执行RestTemplate请求。
final ResponseEntity<E[]> responseEntity =
(ResponseEntity) super.getRestTemplate()
.exchange(urlBuilder.getURL(), httpMhetod,
requestEntity, this.entityArray.getClass());其中,urlBuilder.getURL() (URL string,这里@PathVariables工作正常)和this.getHttpHeaders()返回下一个HttpHeaders配置。
RestFactory.httpHeaders = new HttpHeaders();
RestFactory.httpHeaders.setAuthorization(this.getAuthorization(user));
RestFactory.httpHeaders.set(HttpHeaders.CONNECTION, "Close"); // Switch off keep-alive.
RestFactory.httpHeaders.set(HttpHeaders.ACCEPT_LANGUAGE, "en-US,en;q=0.8");
RestFactory.httpHeaders.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);super.getRestTemplate()是一个单例方法,它返回使用我自己的CloseableHttpClient配置设置的RestTemplate实例。
我知道application/json的HttpHeaders.CONTENT_TYPE丢失了,但实际上,它是有意识的,当http body有效负载不为空时,它可以工作,当它为空时,它就失败了。
当错误发生时,在请求流进入控制器方法之前执行415,因此不执行任何操作。
UPDATE#2
另一个有趣的地方是,Jackson2将NULL值序列化为" null“字符串,然后主体有效负载不是null,而是填充了"null”。
发布于 2016-01-04 22:11:45
我尝试过重现这个问题,但没有太多成功。
您确认使用curl命令时问题仍然存在吗?类似curl -vvv -X POST https://example.com/entity/12/50/10的代码(如果是,请将输出粘贴到此处)
对于spring-android中的RestTemplate,我不是100%同意,但是如果没有提供内容类型,模板将默认添加一个"Content-Type: application/x-www-form-urlencoded"。如果是这种情况,为"org.springframework.web"配置"DEBUG"日志级别应该显示如下内容
[INFO] [talledLocalContainer] org.springframework.web.HttpMediaTypeNotSupportedException:
Content type 'application/x-www-form-urlencoded' not supported我认为您无论如何都应该设置Content-Type。你提到当你这样做的时候会失败--你能详细解释一下吗?
https://stackoverflow.com/questions/34577752
复制相似问题