Установка сообщения ValidationError для указанного элемента c в списке - PullRequest
0 голосов
/ 05 марта 2020

В настоящее время я реализую пользовательскую проверку в игровой среде, Java. У меня есть класс, который содержит список элементов:

public class StandardRequest{
...
private List<@Valid StandardMaterial> materials;
...
//getters setters

И класс StandardMaterial имеет лог проверки c внутри него:

@Validate
public class StandardMaterial  extends Material implements Validatable<ValidationError> {
private Integer condition_value;
...
 @Override
    public ValidationError validate() {
          if(condition_value < 0 || condition_value > 100){
                        return new ValidationError("materials","must be integer between 0 and 100");
           }

Ввод json для вышеупомянутого класс таков:

"materials": [{"material_number": "1", "condition_type":"A1","condition_value": "-15"},
                {"material_number": 2","condition_type":"A2","condition_value": "-25"}]

Это приводит к появлению сообщения об ошибке проверки в ответ так:

 "validations": [
            {
                "property": "materials",
                "message": "must be integer between 0 and 100"
            },
            {
                "property": "materials",
                "message": "must be integer between 0 and 100"
            }
        ],

Чего я не могу достичь сейчас, чтобы получить индекс указанного материала, мне нужно чтобы получить этот ответ:

"validations": [
            {
                "property": "materials[0]",
                "message": "must be integer between 0 and 100"
            },
            {
                "property": "materials[1]",
                "message": "must be integer between 0 and 100"
            }
        ],

Any ideas how can I do that?
Thanks in advance

1 Ответ

0 голосов
/ 05 марта 2020

1. Отредактируйте свой класс StandardMaterial, как показано ниже

import javax.validation.constraints.Min;
import javax.validation.constraints.Max;

public class StandardMaterial {

@Size(value=0,message="must be greater than or equal to 0")
@Size(value=100,message="must be less than or equal to 100")
private Integer condition_value;

}

2. Создайте отдельный класс для обработки этого типа ошибок из любого класса по всему миру, используя @ RestControllerAdvise

@RestControllerAdvice
public class GlobleExceptionHandler extends ResponseEntityExceptionHandler{

@Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
            HttpHeaders headers, HttpStatus status, WebRequest request) {

//Get All Errors
List<FieldError> errors = ex.getBindingResult().getFieldErrors();

//Iterate and add to your custom object
for(FieldError e:errors){
    e.getDefaultMessage();//Your Error Message
    e.getField();//Field Name with index
}

}

}

Таким образом, вы можете сделать это ... я не показал все ... но вы получите идею о том, как это сделать.

...