Java – необходимо инициализировать переменную перед вызовом конструктора super() ⇐ JAVA
-
Anonymous
Java – необходимо инициализировать переменную перед вызовом конструктора super()
Примечание: часть кода будет на испанском языке.
Привет. Я создал хорошую модель исключений для своего приложения Spring Boot, так что каждое вызываемое мной персонализированное исключение создает персонализированный ответ (в данном случае это класс с именем ErrorModel), поэтому я могу перехватить это исключение в @RestControllerAdvice с @ExceptionHandler и просто верните errorModel, созданный этим конкретным исключением. Особенностью каждой errorModel, созданной в персонализированных исключениях, являются код и описание.
@Slf4j @RestControllerAdvice общественный класс GlobalExceptionHandler { @ExceptionHandler(ClienteSinMorasException.class) @ResponseStatus(HttpStatus.NOT_FOUND) @ResponseBody public ErrorModel manejoDeClienteSinMoras (ClienteSinMorasException ex) { вернуть ex.getErrorModel(); } } @Getter @AllArgsConstructor общественный класс ErrorModel { частная финальная строка codigo; частное окончательное описание строки; частные финальные ошибки ArrayList; //не принимайте это во внимание } Итак, поскольку каждое исключение работает одинаково, и единственная разница — это код (codigo) и описание (descipcion), я создал это, и все работало нормально:
публичный абстрактный класс IErrorException расширяет RuntimeException { @Getter частная окончательная ErrorModel errorModel; публичная абстрактная строка getCodigo(); публичная абстрактная строка getDescripcion(); общественное IErrorException () { супер(); this.errorModel = новая ErrorModel(this.getCodigo(), this.getDescripcion(), null); } public IErrorException(ArrayList ошибки) { супер(); this.errorModel = новая ErrorModel(this.getCodigo(), this.getDescripcion(), errores); } public IErrorException (String errorKey, String errorValue) { супер(); ArrayList errores = new ArrayList(); errores.add(new HashMap(Map.of(errorKey, errorValue))); this.errorModel = новая ErrorModel(this.getCodigo(), this.getDescripcion(), errores); } } // Одно из исключений @Getter общественный класс ClienteSinMorasException расширяет IErrorException { частная финальная строка codigo = «код»; частная окончательная строка описание = "дескрипция"; общественный ClienteSinMorasException () { супер(); } public ClienteSinMorasException (ошибки ArrayList) { супер(ошибки); } public ClienteSinMorasException (String errorKey, String errorValue) { супер (errorKey, errorValue); } } Это было идеально (за исключением этих суперов, но неважно), но недавно они попросили меня изменить это, чтобы код и описание считывались из .yml. свойства, чтобы значения можно было изменять во время выполнения без необходимости перезапуска приложения. Это простое изменение сломало все.
Я понял, что единственная причина, по которой это сработало, заключалась в том, что поля final типов явных примитивов «вроде как уже существуют», когда в абстрактном классе я делаю this.getCodigo() (в этом примере возвращается «код»). Если он не final и не относится к типу явный примитив, это не работает, оно загружает все ПОСЛЕ выполнения конструктора, поэтому в конечном итоге я создаю < code>new ErrorModel(null, null, null). Кроме того, super() должен быть первым в конструкторе, поэтому я не могу правильно инициализировать переменные.
// Одно из исключений @Getter общественный класс ClienteSinMorasException расширяет IErrorException { частная финальная строка codigo = Yml.get("cod"); частное окончательное описание строки = Yml.get("desc"); общественный ClienteSinMorasException () { супер(); } public ClienteSinMorasException (ошибки ArrayList) { супер(ошибки); } public ClienteSinMorasException (String errorKey, String errorValue) { супер (errorKey, errorValue); } } Это не работает, и, честно говоря, я не знаю, что делать.
Примечание: часть кода будет на испанском языке.
Привет. Я создал хорошую модель исключений для своего приложения Spring Boot, так что каждое вызываемое мной персонализированное исключение создает персонализированный ответ (в данном случае это класс с именем ErrorModel), поэтому я могу перехватить это исключение в @RestControllerAdvice с @ExceptionHandler и просто верните errorModel, созданный этим конкретным исключением. Особенностью каждой errorModel, созданной в персонализированных исключениях, являются код и описание.
@Slf4j @RestControllerAdvice общественный класс GlobalExceptionHandler { @ExceptionHandler(ClienteSinMorasException.class) @ResponseStatus(HttpStatus.NOT_FOUND) @ResponseBody public ErrorModel manejoDeClienteSinMoras (ClienteSinMorasException ex) { вернуть ex.getErrorModel(); } } @Getter @AllArgsConstructor общественный класс ErrorModel { частная финальная строка codigo; частное окончательное описание строки; частные финальные ошибки ArrayList; //не принимайте это во внимание } Итак, поскольку каждое исключение работает одинаково, и единственная разница — это код (codigo) и описание (descipcion), я создал это, и все работало нормально:
публичный абстрактный класс IErrorException расширяет RuntimeException { @Getter частная окончательная ErrorModel errorModel; публичная абстрактная строка getCodigo(); публичная абстрактная строка getDescripcion(); общественное IErrorException () { супер(); this.errorModel = новая ErrorModel(this.getCodigo(), this.getDescripcion(), null); } public IErrorException(ArrayList ошибки) { супер(); this.errorModel = новая ErrorModel(this.getCodigo(), this.getDescripcion(), errores); } public IErrorException (String errorKey, String errorValue) { супер(); ArrayList errores = new ArrayList(); errores.add(new HashMap(Map.of(errorKey, errorValue))); this.errorModel = новая ErrorModel(this.getCodigo(), this.getDescripcion(), errores); } } // Одно из исключений @Getter общественный класс ClienteSinMorasException расширяет IErrorException { частная финальная строка codigo = «код»; частная окончательная строка описание = "дескрипция"; общественный ClienteSinMorasException () { супер(); } public ClienteSinMorasException (ошибки ArrayList) { супер(ошибки); } public ClienteSinMorasException (String errorKey, String errorValue) { супер (errorKey, errorValue); } } Это было идеально (за исключением этих суперов, но неважно), но недавно они попросили меня изменить это, чтобы код и описание считывались из .yml. свойства, чтобы значения можно было изменять во время выполнения без необходимости перезапуска приложения. Это простое изменение сломало все.
Я понял, что единственная причина, по которой это сработало, заключалась в том, что поля final типов явных примитивов «вроде как уже существуют», когда в абстрактном классе я делаю this.getCodigo() (в этом примере возвращается «код»). Если он не final и не относится к типу явный примитив, это не работает, оно загружает все ПОСЛЕ выполнения конструктора, поэтому в конечном итоге я создаю < code>new ErrorModel(null, null, null). Кроме того, super() должен быть первым в конструкторе, поэтому я не могу правильно инициализировать переменные.
// Одно из исключений @Getter общественный класс ClienteSinMorasException расширяет IErrorException { частная финальная строка codigo = Yml.get("cod"); частное окончательное описание строки = Yml.get("desc"); общественный ClienteSinMorasException () { супер(); } public ClienteSinMorasException (ошибки ArrayList) { супер(ошибки); } public ClienteSinMorasException (String errorKey, String errorValue) { супер (errorKey, errorValue); } } Это не работает, и, честно говоря, я не знаю, что делать.
Мобильная версия