Ошибка: отсутствует оператор возврата при создании нового исключения ResponseStatusException в методе - PullRequest
0 голосов
/ 13 марта 2020

Моя IDE будет отображать ошибку «пропущенный оператор возврата» в блоке catch при попытке вызвать новое исключение в методе вместо непосредственного его выброса.

Минимизированная выборка контроллера REST:

@RestController
public class RootController {
  protected final Logger log = Logger.getLogger("myLogger");

  @PostMapping(
    value={"sample/",
           "sample/123"},
    consumes = MediaType.APPLICATION_JSON_VALUE,
    produces = MediaType.APPLICATION_JSON_VALUE)
  public @ResponseBody Object getFileContentPost (@RequestBody Request payload) {
    return checkPayloadAndRespond(payload.getFileName());
  }

  private Object checkPayloadAndRespond(String fileName) throws ResponseStatusException {
    if (StringUtils.isEmpty(fileName))
      logErrorAndThrowResponseException(HttpStatus.BAD_REQUEST, "Field fileName is empty or missing!", null);

    try {
      ObjectMapper mapper = new ObjectMapper();
      return mapper.readValue("/static/json/" + fileName , Object.class);
    } catch (IOException e) {
      //line causing ERROR "missing return statement":
      logErrorAndThrowResponseException(HttpStatus.INTERNAL_SERVER_ERROR, "Could not parse file!, e);
    }
  }

  private void logErrorAndThrowResponseException(HttpStatus status, String reason, @Nullable Throwable cause) throws ResponseStatusException {
    log.error("Error occurred: " + reason + ", returning status: " + status);
    throw new ResponseStatusException(status, reason, cause);
  }


}

Рабочий пример: если я использую оператор throw new напрямую без метода:

@RestController
public class RootController {
  protected final Logger log = Logger.getLogger("myLogger");

  @PostMapping(
    value={"sample/",
           "sample/123"},
    consumes = MediaType.APPLICATION_JSON_VALUE,
    produces = MediaType.APPLICATION_JSON_VALUE)
  public @ResponseBody Object getFileContentPost (@RequestBody Request payload) {
    return checkPayloadAndRespond(payload.getFileName());
  }

  private Object checkPayloadAndRespond(String fileName) throws ResponseStatusException {
    if (StringUtils.isEmpty(fileName))
      throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Field fileName is empty or missing!", e);

    try {
      ObjectMapper mapper = new ObjectMapper();
      return mapper.readValue("/static/json/" + fileName , Object.class);
    } catch (IOException e) {
      throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Could not parse response file!", e);
    }
  }

}

Каков наилучший способ решить эту проблему?

Все, что я хочу сделать это на самом деле создать журнал всякий раз, когда выдается исключение ResponseStatusException.

Заранее спасибо.

1 Ответ

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

Так что я думаю, что void-return-type является причиной проблемы.

Пока я решил ее, вернув фактический ответ, который я затем выбрасываю:

  private Object checkPayloadAndRespond(String fileName) throws ResponseStatusException {
    if (StringUtils.isEmpty(fileName))
      throw logErrorAndThrowResponseException(HttpStatus.BAD_REQUEST, "Field fileName is empty or missing!", null);

    try {
      ObjectMapper mapper = new ObjectMapper();
      return mapper.readValue("/static/json/" + fileName , Object.class);
    } catch (IOException e) {
throw logErrorAndThrowResponseException(HttpStatus.INTERNAL_SERVER_ERROR, "Could not parse file!, e);
    }
  }

  private ResponseStatusException logErrorAndThrowResponseException(HttpStatus status, String reason, @Nullable Throwable cause) {
    log.error("Error occurred: " + reason + ", returning status: " + status);
    return new ResponseStatusException(status, reason, cause);
  }


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