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

当请求中没有发送正文时,Java/Spring>用@RequestBody处理控制器方法的错误请求响应

林鹏鹍
2023-03-14

长话短说:我正在创建的API应该是100%REST。我试图覆盖以下情况下的默认响应:我的@RestController中有一个方法,它将@RequestBody作为属性

@RequestMapping(value = {"register"}, method = RequestMethod.POST, produces = "application/hal+json")
public Resource<User> registerClient(@RequestBody User user, HttpServletRequest request)

如果我发送一个正确的请求,该方法就会正常工作。但当我没有的时候就有问题了。当一个请求的主体为空时,我会得到一个状态为400的通用Tomcat错误页面,我需要它只发送一个字符串或一个JSON对象。

有人面临类似的问题吗?我是不是漏掉了什么?

共有1个答案

公孙芷阳
2023-03-14

解决方案是简单地在RequestBody注释中添加required=false。之后,我可以轻松地添加一些逻辑来抛出自定义异常,并在ControllerAdvice中处理它。

@RequestMapping(value = {"register"}, method = RequestMethod.POST, produces = "application/hal+json")
public Resource<User> registerClient(@RequestBody(required = false) User user, HttpServletRequest request){
    logger.debug("addClient() requested from {}; registration of user ({})", getClientIp(request), user);
    if(user == null){
        throw new BadRequestException()
                .setErrorCode(ErrorCode.USER_IS_NULL.toString())
                .setErrorMessage("Wrong body or no body in reqest");
    } (...)
 类似资料:
  • 我可以在POST请求时发送对象列表作为响应,并在VueJs客户端中接收它 但是当我尝试用自定义类响应时(我甚至在请求映射注释中添加了) 在axios的帮助下发送VueJs端请求。邮递 Vue用户界面客户端接收 为什么我可以用对象列表响应而不能用POJO响应,以及如何解决这个问题?非常感谢。 PS.项目依赖于jackson-数据库v2.8.2和Spring v4.3.1

  • 我目前正在做一个项目,我需要向spring发送一个POST请求。我已经找了好几个小时的解决方案,但没有找到一个可行的。当我开发该部件时,请求起了作用。问题是,在创建一些新功能(另一个控制器中有两个新endpoint)后,用于创建或更新实体的POST请求停止工作,而不会更改特定区域中的代码。 控制器: 最初,关于消费和生产的部分不在那里,我尝试了它,因为在其他帖子上看到了它,但对情况没有帮助。 传感

  • 我正在学习春靴和反应现在。 book.js bookresourceimp.java

  • 根据请求主体中的session_type,我必须将请求映射到特定的POJO(JSON->JAVA POJO)。 例如,如果请求正文中的'session_type'是'typeX',那么请求应该映射到ClassX POJO。如果请求正文中的“session_type”是“type y”,那么请求应该映射到ClassY POJO。 如果有一种方法可以使用某种requestbody注释来完成它呢?

  • 我想扩展一个Spring应用程序的功能,包括一个HTTPendpoint,以接收贝宝即时支付通知。 Paypal在HTTP正文中发送这些内容,如下所示: MC_Gross=19.95&protection_eligibility=合格&address_status=确认状态s&txn_type=express_checkout&item_name=&mc_currency=usd&item_num

  • 我的Spring Boot应用程序中有一系列Rest API控制器,其请求映射与某些URL匹配。我需要更改我的实现,以始终确保为所有请求设置特定的自定义标头。如果标头不在那里,我想使请求失败。如果是这样,我想转发到适当的控制器,这将与我当前的实现相同。 有没有办法在Spring Boot做到这一点,而无需修改我现有的控制器呢?我可以尝试使用类似Spring Security的东西吗,即使我的头与安