我有一个类,其中一个方法可以进行简单的计算,可以接受两个数字并给出加法运算。现在,我想将数字以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"
}
答案 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();
}
}
如果num1
或num2
不是数字-则将抛出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
}
}