Весенняя проверка: Пользовательская проверка @RequestBody на основе критериев @RequestParam - PullRequest
0 голосов
/ 28 мая 2019

Я хочу проверить requestbody с аннотацией @Valid.В методе есть значение @RequestParam.Если это значение @RequestParam "min", я хочу, чтобы поле в requestbody было обязательным.Это возможно с аннотациями?

@RequestMapping(method = RequestMethod.POST, value = ProductionResponse.URL, produces = JWSMessageConverter.JWS_MEDIA_TYPE_VALUE)
@ResponseBody
public ResponseEntity<ProductionResponse> richiestaProduzione(@RequestParam("issuerType") String issuerType,
        @RequestParam("issuerCode") String issuerCode, @RequestParam("procedureId") String procedureId,
        @Valid @RequestBody ProductionRequestResource requestBody) {
    if (LOGGER.isDebugEnabled())
        LOGGER.debug("POST " + ProductionResponse.URL);
  @Valid ProductionRequestResource fff = requestBody;
    requestBody.setProcedureResource(issuerType, issuerCode, procedureId);

    try {
        ProductionResponse response = produzioneService.richiestaProduzione(requestBody);
        return ResponseEntity.ok(response);
    } catch (Exception e) {
        LOGGER.error(e.getMessage(), e);
        return ResponseEntity.badRequest().body(ProductionResponse.ko(requestBody, e.getMessage(), requestBody.getNun()));
    }
}

Я хочу, чтобы поле identifierMunicipalityCode в ProductionRequestResource было обязательным, если isserType равно "MIN".

1 Ответ

0 голосов
/ 29 мая 2019

Чтобы продолжить, вот как вы можете реализовать пользовательскую проверку.

Добавить проверку для выдачи исключения, когда для параметра IssueType задано значение MIN, а код муниципалитета пуст / ноль.

@RequestMapping(method = RequestMethod.POST, value = ProductionResponse.URL, produces = JWSMessageConverter.JWS_MEDIA_TYPE_VALUE)
@ResponseBody
public ResponseEntity<ProductionResponse> richiestaProduzione(@RequestParam("issuerType") String issuerType,
        @RequestParam("issuerCode") String issuerCode, @RequestParam("procedureId") String procedureId,
        @RequestBody ProductionRequestResource requestBody) {
    if (LOGGER.isDebugEnabled())
        LOGGER.debug("POST " + ProductionResponse.URL);

    if("MIN".equals(issuerType) && StringUtils.isEmpty(requestBody.getIssuerMunicipalityCode())) {
        throw new IllegalArgumentException("IssuerMuncipalityCode can't be null when IssuerType is MIN");
    }

    try {
        ProductionResponse response = produzioneService.richiestaProduzione(requestBody);
        return ResponseEntity.ok(response);
    } catch (Exception e) {
        LOGGER.error(e.getMessage(), e);
        return ResponseEntity.badRequest().body(ProductionResponse.ko(requestBody, e.getMessage(), requestBody.getNun()));
    }
}

Реализовать обработчик исключений, чтобы перехватывать исключения и создавать тело ответа на основе типов исключений. Исключительная ситуация InvalidArgumentSuppliedException будет перехвачена обработчиком исключений ниже. Обработчик исключений - это лучшая практика для обработки исключений в отдельном компоненте.

@ControllerAdvice
public class ScnSchedulerExceptionHandler {

    @ExceptionHandler(InvalidArgumentSuppliedException.class)
    public final ResponseEntity<Object> handleInvalidArgException(Exception ex) {
        ErrorResponseDTO errorDTO = new ErrorResponseDTO();
        errorDTO.setMessage(ex.getMessage());
        return new ResponseEntity<>(errorDTO, HttpStatus.NOT_ACCEPTABLE);
    }

    @ExceptionHandler(Exception.class)
    public final ResponseEntity<Object> handleAllExceptions(Exception ex) {
        ErrorResponseDTO errorDTO = new ErrorResponseDTO();
        errorDTO.setMessage("Internal server error occurred.");
        return new ResponseEntity<>(errorDTO, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

В обработчике исключений оберните сообщения об ошибках в объект pojo.

public class ErrorResponseDTO {

    private String errorMessage;

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