当前位置: 首页 > 知识库问答 >
问题:

Spring4@RequestBody required不起作用

邵展
2023-03-14

我已经从4.0升级了Spring版本。从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,例如,设置emptyEntityFilterParam实例就足以修复它。但我想了解,这个令人烦恼的问题是否是因为我的错误概念,或者更确切地说是因为新的Spring版本的错误。

更新#1

版本

<spring-version>4.2.4.RELEASE</spring-version>
<jackson-2-version>2.3.2</jackson-2-version>

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

通用方法,适用于4.0。x版本,其中EntityFilterParam可以为null。

super.doRestList(
    new HttpEntity<EntityFilterParam>(EntityFilterParam, this.getHttpHeaders()),
    HttpMethod.POST,
    urlBuilder);

在4.2.3和4.2.4中,要解决此问题,EntityFilterParam不能为null-

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字符串,在这里@Path变量工作正常)和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);

超级。getRestTemplate()是一个单例方法,它返回带有我自己的CloseableHttpClient配置的RestTemplate实例集。

我知道HttpHeaders。application/json的CONTENT\u TYPE丢失,但有意识地,事实上,它在http正文负载不为空时工作,在为空时失败。

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

更新#2

另一个有趣的点是,Jackson2将null值序列化为“null”字符串,然后主体负载不是null,而是用“null”填充。

共有1个答案

柯良骏
2023-03-14

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

您是否确认使用curl命令问题仍然存在?类似curl-vvv-X POSThttps://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

我认为你应该设置内容类型。你提到当你这样做的时候这是失败的——你能详细说明一下吗?

 类似资料:
  • 使用spring4@transactional和jdbctemplate时事务不起作用!!请帮帮我 application.xml 代理创建失败?

  • 我有基类和,它们有多个实现。但是,每个参数化类型只有一个实现,因此应该能够确定需要哪个子类。 在将第二个参数添加到基类和(从而添加到它们的所有子类)之前,这实际上是有效的。但是在添加了这些之后,下面是Spring初始化期间的错误: UnsatisfiedDependencyException:创建名为“My App”的bean时出错:通过字段“x1”表示的未满足的依赖项;嵌套异常为org.spri

  • 有人能通过xml使用Spring < code > JCacheCacheManager 创建一个Ehcache支持的< code>CacheManager吗?我有这样的东西。不知道如何为Ehcache3创建< code > javax . cache . cache manager 。 谢谢!

  • > 此代码在Spring5中工作。但我的公司需要Spring 4。 在Spring4中,login与InMemoryAuthentication一起工作很好。但是当我添加了jdbc逻辑(c3p0,MySQL依赖关系&add DataSource代码&jdbc连接,c3p0连接池.properties文件);服务器运行,登录页打开,但身份验证失败(用户名/密码不正确)。 下面是包结构 null 公共

  • 因此,我在一个控制器中有一个非常简单的代码片段,在这个代码片段中,我使用从外部文件中获取数据,它工作得很好!但是当我使用时,我会在控制台中得到一个

  • 问题内容: 正则表达式似乎还可以,因为第一行将子字符串正确替换为“ helloworld”,但是后者却不匹配,因为我看不到“ whynothelloworld?”。在控制台上 问题答案: 期望 整个 字符串匹配,而不仅仅是子字符串。 使用正则表达式匹配器对象的方法代替: