Json 缺少@RequestBody方法参数的异常消息
首先,如果您有任何想法或解决方案,感谢您在这里介绍。 我在我的一个控制器上使用@RequestBody作为一个必需的参数,我需要一些有用的方法来说明哪个参数丢失了,如果它不存在的话。 当缺少一些参数时,它将抛出NullPointerException,因此我为这个null异常的实例创建了一个新的异常(请参阅httpemun和httphandler) 这些是关于这个问题的主要代码 我的控制器:Json 缺少@RequestBody方法参数的异常消息,json,spring-mvc,exception-handling,nullpointerexception,httpexception,Json,Spring Mvc,Exception Handling,Nullpointerexception,Httpexception,首先,如果您有任何想法或解决方案,感谢您在这里介绍。 我在我的一个控制器上使用@RequestBody作为一个必需的参数,我需要一些有用的方法来说明哪个参数丢失了,如果它不存在的话。 当缺少一些参数时,它将抛出NullPointerException,因此我为这个null异常的实例创建了一个新的异常(请参阅httpemun和httphandler) 这些是关于这个问题的主要代码 我的控制器: public ResponseEntity<?> createOrder(@RequestB
public ResponseEntity<?> createOrder(@RequestBody Cart cart) throws Exception {
// ......
}
我的Http emun类:
public enum HttpStatusEnum {
CRE_CART_INCOMPLETE_BODY(400,"E001","Incomplete request body","");
private HttpStatusEnum(int statusCode, String code,
String message, String detail) {
this.statusCode = statusCode;
this.code = code;
this.message = message;
this.detail = detail;
}
private final int statusCode;
private final String code;
private final String message;
private String detail;
public int getStatusCode() {
return statusCode;
}
public String getCode() {
return code;
}
public String getMessage() {
return message;
}
public void setDetail(String detail) {
this.detail = detail;
}
public String getDetail() {
if(detail.isEmpty()) {
return message;
}else {
return detail;
}
}
}
我还有一个异常句柄
@ControllerAdvice
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ResponseEntity<Object> defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
if(e instanceof NullPointerException)
{if(req.getRequestURL().toString().contains(HttpSourceEnum.CART.toString()) && req.getMethod().equals(RequestMethod.POST.toString())){
errorBodyVo.setMessage(HttpStatusEnum.CRE_CART_INCOMPLETE_BODY.getMessage());
errorBodyVo.setDetails(HttpStatusEnum.CRE_CART_INCOMPLETE_BODY.getDetail());
errorBodyVo.setCode(HttpStatusEnum.CRE_CART_INCOMPLETE_BODY.getCode());
}else {
errorBodyVo.setMessage(HttpStatusEnum.COMMON_MISSING_FIELD.getMessage());
errorBodyVo.setDetails(HttpStatusEnum.COMMON_MISSING_FIELD.getDetail());
errorBodyVo.setCode(HttpStatusEnum.COMMON_MISSING_FIELD.getCode());
}
httpStatus = HttpStatus.BAD_REQUEST;
}
}
我收到的API响应如下所示:
{
"error": {
"code": "E001",
"message": "Incomplete request body",
"details": ""
}
}
{
"cartId": "109",
"status": "1",
}
但这不符合我的期望。
如果我的请求中缺少以下频道:
{
"error": {
"code": "E001",
"message": "Incomplete request body",
"details": ""
}
}
{
"cartId": "109",
"status": "1",
}
我希望在详细信息中显示“缺少必需的请求正文内容:通道”:
{
"error": {
"code": "E001",
"message": "Incomplete request body",
"details": "Required request body content is missing: Channel"
}
}
我怎么能这么做?谢谢大家 如果您能做到这一点,一个更好的方法可能是使用JSR303验证,假设您使用的是最新版本,它可能包含在您现有的Spring依赖项中 这里有一个很好的教程,如果很简单的话:还有更多关于细节的在线教程 有关该主题的官方春季文件如下: 您应该只需要对几个类进行更改,并且可以潜在地删除大量异常处理,这取决于您需要多少控制,或者您愿意使用Spring的默认值。不过,您需要进行的基本更改包括: 要告诉Spring需要什么样的验证,可以向
购物车
类添加一个或多个注释,例如,如果要确保指定了通道,可以执行以下操作:
public class Cart{
@NotNull
private String channel
private String cartId;
private String status;
private String currency;
然后,要指示Spring在将Cart
对象传递给控制器之前验证该对象,您需要向控制器方法签名添加@Valid
注释:
public ResponseEntity<?> createOrder(@Valid @RequestBody Cart cart) throws Exception {
然后,在
createOrder
方法中,您可以查询Errors
对象并做出相应的响应。这可能意味着从控制器发送特定的响应,或者抛出一个异常,由现有的异常处理机制来处理。是否可以编辑问题以包含控制器?将抛出什么异常以进入ExceptionHandler?你用“NullPointerException”标记了这个问题,是吗?是的,你要求我补充一些东西。。。
public ResponseEntity<?> createOrder(@Valid @RequestBody Cart cart, Errors errors) throws Exception {