Я пытаюсь получить ввод из тела json и хочу проверить, все ли входные данные верны, если не исключение - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть класс, в котором метод выполняет простые вычисления, принимает два числа и дает сложение. Теперь я хочу передать числа через api в формате json и проверить, являются ли входные значения числами, если не с помощью исключений.

    @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);

    }

имеет класс ответа с необходимыми переменными и методом получения и установки

 input
 {
   num1="",
   num2=2
 }

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

Ответы [ 4 ]

0 голосов
/ 12 февраля 2019

Способ (не абсолютный, и он может отличаться от варианта использования к сценарию использования) сделать это путем создания соответствующей сущности, представляющей ожидаемое тело 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
    }
}
0 голосов
/ 12 февраля 2019

Вы можете проверить его в контроллере:

@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.

0 голосов
/ 12 февраля 2019

Если вы хотите получить входные параметры из JSON - тогда вам, вероятно, следует (но это не обязательно, есть другие способы получить JSON от клиента) получить их из тела HTTP-запросов, но в вашем коде - вы ожидаетепараметры из пути.

Вы должны создать класс модели, например:

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

Затем вы можете получить объект SumModel, который был передан как тело HTTP-запросов, используяследующий код:

@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.

. Вы также можете применить некоторые проверки bean аннотаций или создать собственные - для SumModel класса.

ЕслиВы хотите получить JSON из некоторого @PathVariable, тогда вам нужно создать пользовательский DataBinder для вашего типа.

0 голосов
/ 12 февраля 2019

Вы можете сделать что-то вроде этого:

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, создавая правильный ответ, такой как соответствующий код ответа, сообщение и возвращая его.Но я просто даю вам идею, как это можно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...