根据验证结果设置不同的http状态代码

时间:2019-05-23 16:58:21

标签: java spring

我需要为我的REST Web服务请求设置不同的HTTP状态代码。 基本上用户会发送ISBN号,我需要对其进行验证 1.如果用户发送空的请求正文,则给出错误消息ISBN不能为空 并设置http状态代码 2.如果用户提供了Alphabets,则给出了错误消息,Allowers不允许,并设置了适当的http状态代码 3.如果用户输入错误的格式,请给错误消息输入错误的格式,并设置不同的HTTP状态代码。 4.如果isbn无效,则给出错误消息“无效的ISBN号”,并设置适当的HTTP状态代码。 5.如果输入有效的ISBN号,则返回http状态为200的书名。

我尝试设置http状态代码,但未反映出来。

 @RequestMapping(value = "/person", method = RequestMethod.POST,
         consumes = "application/json", produces = "application/json")
    public ResponseEntity<StatusBean>  findBook(@RequestBody String json) {

     StatusBean sb = new StatusBean();
     if(json==null) {
         sb.setMessage("Request Cannot be Null");               
            return new ResponseEntity<StatusBean>(sb,HttpStatus.BAD_REQUEST);
     }
     if(!isNumeric(json)) {
         sb.setMessage("Request Cannot have Alphabets Characters");
        //here i need to set different status
         return new ResponseEntity<StatusBean>(sb,HttpStatus.BAD_REQUEST);
     }
     if(!isValidFormat(json)) {
         sb.setMessage("Request Cannot have Alphabets Characters");
         //here i need to set different status
         return new ResponseEntity<StatusBean>(sb,HttpStatus.BAD_REQUEST);
     }
     if(!isValidISBN(json)) {
         sb.setMessage("Request Cannot have Alphabets Characters");
         //here i need to set different status
         return new ResponseEntity<StatusBean>(sb,HttpStatus.BAD_REQUEST);
     }

     Map<String,String> map = new HashMap<>();          
        map.put("book", "Effective Java");  
        sb.setResponseJSONMap(map);      
        return new ResponseEntity<StatusBean>(sb,HttpStatus.OK);
}

公共类StatusBean {

private String message;
private Map<String,String> responseJSONMap;

public String getMessage() {
    return message;
}
public void setMessage(String message) {
    this.message = message;
}
public Map<String, String> getResponseJSONMap() {
    return responseJSONMap;
}
public void setResponseJSONMap(Map<String, String> responseJSONMap) {
    this.responseJSONMap = responseJSONMap;
}

}

2 个答案:

答案 0 :(得分:0)

 @RequestMapping(value = "/person", method = RequestMethod.POST,
     consumes = "application/json", produces = "application/json")
public ResponseEntity<StatusBean>  findBook(@RequestBody(required=false) String json) {
  // rest of the code
}

尝试对请求正文使用(required = false)。 Spring默认情况下需要resuest正文。

答案 1 :(得分:0)

最优雅的解决方案之一是:

您可以在发生验证错误的情况下引发自定义异常,如下所示:

@RequestMapping(...)
public ResponseEntity<StatusBean> findBook(@RequestBody String json) throws Exception {
    ...
    if(json==null) {
        throw new NullRequestException();               
    }

    if(!isNumeric(json)) {
        throw new RequestContainsAlphabetsException();
    }

    if(!isValidFormat(json)) {
        throw new InvalidFormatException();
    }
    ...
}

然后您需要在应用程序级别定义一个自己的全局异常处理程序。在此自定义异常处理程序中,您将捕获引发的异常,并通过自定义错误消息,HTTP响应代码,时间戳等将正确的响应发送回客户端。

有关更多详细信息,请参见此page