@NotNull: пользовательское сообщение проверки не отображается - PullRequest
0 голосов
/ 18 сентября 2018

Я использую пружинные данные JPA для создания приложения.В этом я пытаюсь реализовать проверку на стороне сервера с помощью аннотации.Я добавил @NotNull аннотацию в поле с пользовательским сообщением.Я также добавил @valid с @RequestBody

Но проблема в том, что, когда я передаю nAccountId как null, я не получаю пользовательское сообщение, т.е. Account id can not be null Я получаю "message": "Validation failed for object='accountMaintenanceSave'. Error count: 1",.

Может ли кто-нибудь сказать мне, почему я не получаю пользовательское сообщение?

Код контроллера

@PutMapping("/updateAccountData")
public ResponseEntity<Object> saveData(@Valid @RequestBody AccountMaintenanceSave saveObj){
    return accService.saveData(saveObj);
} 

Класс AccountMaintenanceSave

import javax.validation.constraints.NotNull;

public class AccountMaintenanceSave {   

    @NotNull(message="Account id can not be null")
    public Integer nAccountId;
    @NotNull
    public String sClientAcctId;
    @NotNull
    public String sAcctDesc;
    @NotNull
    public String sLocation;
    @NotNull
    public Integer nDeptId; 
    @NotNull
    public Integer nAccountCPCMappingid;
    @NotNull
    public Integer nInvestigatorId;

    //Getter and Setter
}

RestExceptionHandler class

@ControllerAdvice
public class RestExceptionHandler { 

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Object> handleAllExceptionMethod(Exception ex, WebRequest requset) {

        ExceptionMessage exceptionMessageObj = new ExceptionMessage();

        exceptionMessageObj.setMessage(ex.getLocalizedMessage());
        exceptionMessageObj.setError(ex.getClass().getCanonicalName());
        exceptionMessageObj.setPath(((ServletWebRequest) requset).getRequest().getServletPath());

        // return exceptionMessageObj;
        return new ResponseEntity<>(exceptionMessageObj, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

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

{
  "message": "Validation failed for argument at index 0 in method: public org.springframework.http.ResponseEntity<java.lang.Object> com.spacestudy.controller.AccountController.saveData(com.spacestudy.model.AccountMaintenanceSave), with 1 error(s): [Field error in object 'accountMaintenanceSave' on field 'nAccountId': rejected value [null]; codes [NotNull.accountMaintenanceSave.nAccountId,NotNull.nAccountId,NotNull.java.lang.Integer,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [accountMaintenanceSave.nAccountId,nAccountId]; arguments []; default message [nAccountId]]; default message [Account id can not be null]] ",
  "error": "org.springframework.web.bind.MethodArgumentNotValidException",
  "path": "/spacestudy/rockefeller/admin/account/updateAccountData"
}

В message поле я могу напечатать только [Account id can not be null]?

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Можете ли вы попробовать приведенный ниже код?

import javax.validation.constraints.NotNull;

public class AccountMaintenanceSave { 

@NotNull(nullable=false,message="Account id can not be null")
public Integer nAccountId;
@NotNull
public String sClientAcctId;
@NotNull
public String sAcctDesc;
@NotNull
public String sLocation;
@NotNull
public Integer nDeptId; 
@NotNull
public Integer nAccountCPCMappingid;
@NotNull
public Integer nInvestigatorId;

//Getter and Setter
}
0 голосов
/ 19 сентября 2018

Попробуй это.

@ControllerAdvice
public class RestExceptionHandler { 

    @ExceptionHandler(Exception.class)
    public ResponseEntity<Object> handleAllExceptionMethod(Exception ex, WebRequest requset) {

    ExceptionMessage exceptionMessageObj = new ExceptionMessage();

    // Handle All Field Validation Errors
    if(ex instanceof MethodArgumentNotValidException) {
        StringBuilder sb = new StringBuilder(); 
        List<FieldError> fieldErrors = ((MethodArgumentNotValidException) ex).getBindingResult().getFieldErrors();
        for(FieldError fieldError: fieldErrors){
            sb.append(fieldError.getDefaultMessage());
            sb.append(";");
        }
        exceptionMessageObj.setMessage(sb.toString());
    }else{
        exceptionMessageObj.setMessage(ex.getLocalizedMessage());
    }

    exceptionMessageObj.setError(ex.getClass().getCanonicalName());
    exceptionMessageObj.setPath(((ServletWebRequest) requset).getRequest().getServletPath());

    // return exceptionMessageObj;
    return new ResponseEntity<>(exceptionMessageObj, new HttpHeaders(), HttpStatus.INTERNAL_SERVER_ERROR);
  }
}
0 голосов
/ 18 сентября 2018

Не очень хорошо, чтобы ваш только ExceptionHandler ловил Exception.class, чтобы сделать его ConstraintViolationException.class

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