из одного контроллера не равно NPE из другого? В чем разница?
Ну например, апи, где запршивают инфу о пользователе. При этом там много всего проверяется, что-то изменяется, что-то делается. В итоге там может быть NPE, может быть еще какой-то эксепшн. Сейчас в контроллере на самом верху в catch все ловится и возвращается в ответ json со специальной структурой именно для такого запроса + текст ошибки эксепшена. В другом контроллере, для другого апи, также на самом верху все перехватывается, но уже другой json в ответ нужен. Т.е. в первом может быть Exception() но нужен в ответ один json. Во втором тоже Exception() но в ответ нужен уже другой json.
Так как у тебя в зависимости от исключения меняется ответ, то я предполашаю что и на фронте какие-то финтифлюшки меняются, а это уже бизнес логика, поэтому такие трайкечи нужно писать в сервисном слое - там же формировать нужный json. Далее во всех приложениях есть стандартные ошибки типа 404 - тут ну не может быть ничего кастомнго - вот для таких случаев есть общий ContollerAdvice
Ну не совсем от исключения меняется ответ, скорее в разных контроллерах просто разные ответы если есть какой-то эксепшн. Ну и бизнес-логике вроде как не надо знать ничего о том, что у нее спрашивают и откуда. Там просто что-то делается и в итоге либо нормальный ответ, либо исключение. При том, почти все можно привести к одному общему хендлеру, только вот нужна доп инфа, чтобы условия воткнуть. Типа если апи такой, то еще вот это сделаем и можно возвращать ответ. Но в эксепшене из бизнес-логики понятно нет никакой инфы о том какой апи это был
ну хорошо не бизнес логика а логика которая билдит ответ ввиде json (слой представления). Мне это видится так: бизнес слой сделал какие то манипуляции и кинул в слой представления инфу (ошибку, или нормальные значение не важно) эту всю инфу слой представления интерпретирует и формирет json для контроллера Любые другие перестановки на уровне контроллера на мой взгляд бесплоезны, тупо код перенесешь из одного класса в другой
А сейчас никакого слоя представления и нету. В контроллере try-catch на ошибки из бизне-логики и там же формируется json для ответа. Ну и в итоге, выглядит так, что можно было бы сделать ControllerAdvice и и единый хэндлер и перехватывать все Exception там, а не в контроллере. Это убрало бы дублирование кода, т.к. в большинстве своем все эти ответы почти одинаковые. Но именно, что почти. Т.е. в хендлере эксепшена надо все равно знать в каком апи он вылетел. Да, туда в общий хэндлер можно передать HttpServletRequest, можно там попытаться распарсить его и вытащить инфу о том, какой это был апи. Либо, можно также как сейчас в контроллере ловить эксепшн и кидать уже свой кастомный со всем нужным для обработки в общем хэндлере. Я хотел просто узнать насколько это хреновая практика и вообще стоит ли так делать или лучше оставить как есть
Ну либо создать слой представления)
а если так сделать? https://stackoverflow.com/a/47430041/
Ну если твоей команде ок с AOP то можно наверное, но мне кажется это все костыли
Обсуждают сегодня