Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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
Json 缺少@RequestBody方法参数的异常消息_Json_Spring Mvc_Exception Handling_Nullpointerexception_Httpexception - Fatal编程技术网

Json 缺少@RequestBody方法参数的异常消息

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

首先,如果您有任何想法或解决方案,感谢您在这里介绍。 我在我的一个控制器上使用@RequestBody作为一个必需的参数,我需要一些有用的方法来说明哪个参数丢失了,如果它不存在的话。 当缺少一些参数时,它将抛出NullPointerException,因此我为这个null异常的实例创建了一个新的异常(请参阅httpemun和httphandler) 这些是关于这个问题的主要代码

我的控制器:

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 {