Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring4@RequestBody required不';行不通_Spring_Rest_Spring Mvc - Fatal编程技术网

Spring4@RequestBody required不';行不通

Spring4@RequestBody required不';行不通,spring,rest,spring-mvc,Spring,Rest,Spring Mvc,我已经将Spring版本从4.0.x升级到4.2.3(刚才是4.2.4),突然,@RequestBody注释中的“required=false”属性无法按预期工作(在版本更改之前) HttpStatus 415的服务器响应-不支持的媒体类型 控制器方法(每个Spring版本相同) 请求来自Android设备,使用SpringAndroid库(又称RestTemplate) 泛型方法,适用于4.0.x版本,其中EntityFilterParam可以为null super.doRestList(

我已经将Spring版本从4.0.x升级到4.2.3(刚才是4.2.4),突然,@RequestBody注释中的“required=false”属性无法按预期工作(在版本更改之前)

HttpStatus 415的服务器响应-不支持的媒体类型

控制器方法(每个Spring版本相同)

请求来自Android设备,使用SpringAndroid库(又称RestTemplate)

泛型方法,适用于4.0.x版本,其中EntityFilterParam可以为null

super.doRestList(
    new HttpEntity<EntityFilterParam>(EntityFilterParam, this.getHttpHeaders()),
    HttpMethod.POST,
    urlBuilder);
super.getRestTemplate()
是一个单例方法,它使用我自己的CloseableHttpClient配置返回RestTemplate实例集

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);
我知道
HttpHeaders.CONTENT\u TYPE
for
application/json
缺失,但实际上,它在http正文负载不为空时工作,在为空时失败

当错误发生时,在请求流进入控制器方法内部之前执行415,因此,不执行任何操作

final ResponseEntity<E[]> responseEntity =
    (ResponseEntity) super.getRestTemplate()
        .exchange(urlBuilder.getURL(), httpMhetod,
            requestEntity, this.entityArray.getClass());
更新#2


另一个有趣的问题是,Jackson2将null值序列化为“null”字符串,然后主体负载不是null,而是用“null”填充的。我已经尝试复制了这个确切的问题,但没有太大成功

您确认使用curl命令时问题仍然存在吗? 类似于
curl-vvv-X POST的东西https://example.com/entity/12/50/10
(如果是,请将输出粘贴到此处)

对于
springandroid
中的
restemplate
,我并不是百分之百地关注这一点,但是如果没有提供内容类型,模板默认会添加一个
“内容类型:application/x-www-form-urlencoded”
。如果是这种情况,为
“org.springframework.web”
配置
“DEBUG”
日志级别应该显示如下内容

[INFO] [talledLocalContainer] org.springframework.web.HttpMediaTypeNotSupportedException: 
Content type 'application/x-www-form-urlencoded' not supported

我认为您应该设置内容类型。你提到这一点时失败了,你能详细说明一下吗

我试着复制这个问题,但没有多大成功

您确认使用curl命令时问题仍然存在吗? 类似于
curl-vvv-X POST的东西https://example.com/entity/12/50/10
(如果是,请将输出粘贴到此处)

对于
springandroid
中的
restemplate
,我并不是百分之百地关注这一点,但是如果没有提供内容类型,模板默认会添加一个
“内容类型:application/x-www-form-urlencoded”
。如果是这种情况,为
“org.springframework.web”
配置
“DEBUG”
日志级别应该显示如下内容

[INFO] [talledLocalContainer] org.springframework.web.HttpMediaTypeNotSupportedException: 
Content type 'application/x-www-form-urlencoded' not supported


我认为您应该设置内容类型。你提到这一点时失败了,你能详细说明一下吗

“停止工作”是什么意思?省略主体时是否会出现异常?您得到了什么错误?服务器返回415 Http状态(不支持的媒体类型)。令人惊讶,因为我报告了此错误,并且它已在4.2.2中修复。因此,请参见4.2.3和4.2.4中的错误重现:(SPR-13417的修复程序还附带了一个单元测试,它仍然是绿色的。我尝试了以前的repo项目(),它仍然适用于4.2.2、4.2.3和4.2.4。您能否提供有关此问题的更多详细信息:HTTP请求头、控制器方法返回的Jackson view+对象的代码示例?什么是“停止工作”意思是?省略正文时是否会出现异常?会出现什么错误?服务器返回415 Http状态(不支持的媒体类型)。令人惊讶的是,因为我报告了此错误,并且它已在4.2.2中修复。因此,请参见4.2.3和4.2.4中的错误恢复:(SPR-13417的修复程序还附带了一个单元测试,它仍然是绿色的。我用以前的repo项目()它仍然适用于4.2.2、4.2.3和4.2.4。您能否提供有关此问题的更多详细信息:HTTP请求头、控制器方法返回的Jackson view+对象的代码示例?已解决,问题不是来自Spring或RestTemplate,问题是Jackson2将空值序列化为“null”字符串,则主体有效负载不为null,并用“null”填充。非常感谢您的关注。在这种情况下,它仍然应该工作-签出,嗯,嗯,好的,我正在进行。您可以检查这个复制项目-它现在可以与Spring 4.2一起正常工作:已解决,问题不是来自Spring或RestTemplate,再次强调的是Jackson2将空值序列化为“null”字符串,然后主体有效载荷不是空的,用“空”填充。非常感谢您的兴趣。在这种情况下,它仍然应该工作-签出,嗯,嗯,好的,我在上面。您可以检查这个复制项目-它现在可以与Spring 4.2一起正常工作:
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);
[INFO] [talledLocalContainer] org.springframework.web.HttpMediaTypeNotSupportedException: 
Content type 'application/x-www-form-urlencoded' not supported