我正在尝试从json主体获取输入,并希望验证所有输入是否正确(如果不是通过异常)

时间:2019-02-12 10:30:59

标签: java spring rest api spring-boot

我有一个类,其中一个方法可以进行简单的计算,可以接受两个数字并给出加法运算。现在,我想将数字以json格式通过api传递,并验证输入是否为数字(如果不是通过运算符)。

    @RestController
    @RequestMapping(value="/TC")
    public class CountSpringAppController {

    @Autowired
    private CountService countService;

    @PostMapping(value="/add/{number1}/{number2}") 
    public int getCount(@PathVariable int num1,@PathVariable int num2) {

        return countService.count(num1, num2);
    }

    @Service
    public class CountService {

        public int count(int num1, int num2) {
            if (num1==null) {
                return; //exception
            }
            return num1+num2;     
        }
    }
  

例外类别

@RestControllerAdvice
public class AppExceptionHandler extends ResponseEntityExceptionHandler{

    @ExceptionHandler(value= {Exception.class})
    public ResponseEntity<Object> handleAnyException(Exception 
    ex,WebRequest request){
        return new ResponseEntity<Object>(ex,new 
    HttpHeaders(),HttpStatus.INTERNAL_SERVER_ERROR);

    }

具有带有必需变量以及getter和setter方法的响应类

 input
 {
   num1="",
   num2=2
 }

 output 
 {
   error code:404
   message: "number cannot be null"
   ststus :"Fail"
 }

4 个答案:

答案 0 :(得分:1)

您可以在控制器中对其进行验证:

@PostMapping(value="/add/{number1}/{number2}") 
public int getCount(@PathVariable @NotNull Integer num1,@PathVariable @NotNull Integer num2) {
    return countService.count(num1, num2);
}

它将抛出NullPointerException输入的数据不是整数。

现在您应该赶上这次发现并返回对象

@ExceptionHandler(NullPointerException.class)
public ResponseEntity<*JSON*> handleNullPointerException() {
    return ResponseEntity.status(HttpStatus.*Status*).body(*JSON*);
}

只需将 JSON 编辑为您的对象,并将 Status 编辑为http状态。

答案 1 :(得分:0)

您可以执行以下操作:

Class ApiRequestBody {
    private Integer num1;
    private Integer num2;

    public ApiRequestBody(Integer num1, Integer num2){
        num1 = num1;
        num2 = num2;
    }
    // Rest of getter and setters
}

@PostMapping(value="/add") 
public int getCount(@RequestBody ApiRequestBody request) {
    return countService.count(request.getNum1(), request.getNum2());
}


@Service
public class CountService throws Exception{
    public int count(Integer num1, Integer num2) {
    if(num1==null || num2 ==  null){
        throw new Exception("Number cannot be null");
    }
    return num1+num2;     
}

创建一个新的响应类:

Class ApiResponse {
private int errorCode;
private String message;
private String status;

public ApiResponse(Exception e){
    errorCode = 400;
    message = e.getMessage();
    status = "Fail";
}
// Rest of the getter and setters
}

然后在您的控制器建议中:

    @ExceptionHandler(value= {Exception.class})
    public ResponseEntity<ApiResponse> handleAnyException(Exception ex,WebRequest request){
        ApiResponse response = new ApiResponse(ex);
        return new ResponseEntity<>(response,new HttpHeaders(),HttpStatus.INTERNAL_SERVER_ERROR);
    }

这只是一个示例。显然,可以通过更好的方式来完成此操作,例如,创建自己的自定义异常类,引发该异常,在Controller Advice中捕获该特定异常,创建正确的响应(如适当的响应代码,消息)并返回它。但是我只是想让您知道如何完成。

答案 2 :(得分:0)

如果您想从JSON获取输入参数-那么您可能应该(但不是强制性的,还有其他从客户端获取JSON的方法)从HTTP Requests正文获取它们,但是在您的代码中-您期望路径中的参数。

您必须创建一个模型类,例如:

class SumModel {
    private int num1;
    private int num2;
    // getters & setters were omitted
}

然后,您可以检索对象SumModel,该对象使用下面的代码作为HTTP Requests主体传递:

@PostMapping(value="/add") 
public int getCount(@RequestBody SumModel model) {
    return countService.count(model);
}

您的服务如下:

@Service
public class CountService throws Exception{
    public int count(SumModel model) {
        return model.getNum1() + model.getNum2();     
    }
}

如果num1num2不是数字-则将抛出JsonProcessingException-您将把它捕获在ExceptionHandlerAdvice中。

您还可以为SumModel类应用一些bean validation注释或创建自定义注释。

如果您希望从某些@PathVariable获取JSON,则必须为您的类型创建自定义DataBinder

答案 3 :(得分:0)

执行此操作的一种方法(不是绝对的,并且在不同情况下可能会有所不同)是通过创建代表所需JSON正文的相应实体。

在我的示例中,我想获取留在指定区域的特定班级(文字班级)的所有学生。以下是我的期望:

{     
    "addressPincode": AU1100,
    "classCode": 201
}

这可以轻松映射到相应的请求类,如下所示。

public class StudentRequest {
    String addressPincode;
    Integer classCode;
}

在我的控制器类中,我将添加一个注释@Valid,以确保所有输入均为指定数据类型。

public Class StudentController {
    @PostMapping
    public ResponseEntity<Object> getStudents(@Valid @RequestBody StudentRequest studentRequest) {
        // do something
    }
}