Таким образом, наш проектный проект является приложением Java 8 Springboot, springboot позволяет вам сделать что-то очень просто. ех, запрос проверки:Использование монад в приложении Springboot для исключения исключений
class ProjectRequestDto {
@NotNull(message = "{NotNull.DotProjectRequest.id}")
@NotEmpty(message = "{NotEmpty.DotProjectRequest.id}")
private String id;
}
Когда это ограничение не соответствует, весна (? springboot) на самом деле вызывает исключение проверки, как таковой, мы поймаем его где-нибудь в приложении и построить (Bad Request) ответ 404 для наше приложение.
Теперь, учитывая этот факт, мы своего рода следовали той же философии на протяжении нашего приложения, то есть, на более глубоком уровне приложения мы могли бы иметь что-то вроде:
class ProjectService throws NotFoundException {
DbProject getProject(String id) {
DbProject p = ... // some hibernate code
if(p == null) {
Throw new NotFoundException();
}
return p;
}
}
И снова мы поймаем это исключение на более высокий уровень и построить еще 404 для клиента.
Теперь, это вызывает некоторые проблемы:
Наиболее важным из них: Наша ошибка отслеживания перестает быть полезной, мы не можем дифференцировать (легко), когда исключение имеет важное значение, потому что они происходят все время , поэтому, если служба внезапно начинает бросать ошибки, мы не заметим, пока не станет слишком поздно.
Большое количество бесполезных протоколов, например, при запросах на регистрацию, пользователь может ошибаться в своем пароле, и мы регистрируем это и в качестве второстепенной точки: наша аналитика не может помочь нам определить, что мы на самом деле делаем неправильно, мы видим много из 4xx, но это то, чего мы ожидаем.
Исключения являются дорогостоящими, сбор трассировки стека является ресурсоемкой задачей, второстепенным в этот момент, поскольку масштабирование службы станет проблемой.
Я думаю, что решение вполне понятно, нам нужно сделать архитектурные изменения, чтобы не делать исключения части нашего нормального потока данных, однако это большая перемена, и мы мало времени, поэтому мы планируем мигрировать с течением времени, но проблема остается на короткий срок.
Теперь, к моему фактическому вопросу: когда я спросил одного из наших архитекторов, он предложил использовать монады (как временное решение ofc), поэтому мы не модифицируем нашу архитектуру, а решаем наиболее загрязняющие конечные точки (ex неправильный логин) в краткосрочной перспективе, однако я борюсь с парадигмой монады в целом и даже больше в java, я действительно не знаю, как применить ее к нашему проекту, не могли бы вы мне помочь? некоторые фрагменты кода будут действительно хорошими.
TL: DR: Если вы используете универсальное приложение для загрузки весны, которое вызывает ошибки как часть потока данных, как вы можете применить шаблон монады, чтобы избежать ненужного ввода данных и временно устранить эту ошибку как часть данных архитектуры потока.
Я все еще не понимаю, в чем проблема с исключениями? Они имеют свои собственные типы, поэтому вы можете легко различать их и анализировать их, например, вы можете считать NotFoundException «нормальным», некоторые пользовательские CredentialsDontMatchException (которые будут выбрасываться вашим кодом, а не весной) как «тривиальные», и NullPointerException как добрый критический (поскольку это, вероятно, означает серьезную ошибку). –
Да, это еще один способ сделать это, создать некоторые «приглушенные» исключения, которые мы не регистрируем, одна проблема с этим связана с точкой 3, исключения являются дорогостоящими и делают их частью нашего нормального потока данных, будут ухудшать производительность в конечном счете, мой вопрос идет немного дальше, чтобы попытаться понять, как использовать MONADS, чтобы временно исправить нашу проблему здесь, поэтому, пожалуйста, побалуйте меня :) – ospfranco
Я согласен с Филиппом здесь. Исключения стоят немного больше, чем что-то возвращать, но они делают ваш код намного проще понять и поддерживать. Вы не должны пытаться оптимизировать, если у вас нет проблем с производительностью.И добавить еще один сервер в большинстве случаев дешевле, чем потерять время, поддерживая код, который может быть проще. Я бы просто использовал правильные типы исключений и правильные коды состояния HTTP. Например, отказ аутентификации должен вернуть 401, а не 404 (что означает Not Found, BTW, а не Bad Request). –