предисловие
В прошлый понедельник друг сообщил мне о проблеме. Их проект может быть запущен локально, но сообщается об ошибке в онлайн-среде. Журнал ошибок выглядит следующим образом:
Could not find result map cn.mycs.server.persistence.dao.UserMapper.BaseResultMap
Честно говоря, я так занят каждый день, что мне все равно, когда я вижу такое прямое выбрасывание исключения, но его слова полностью изменили мое мнение.
Эти ключевые слова появляются первыми.
无法解决的bug
ДоФэй Чао неоднократно подчеркивал, Мы смотрим исходный код для решения проблемы, а не просто для того, чтобы прикинуться интервьюером.风骚走位完美避开了最高效的解决问题方式
特定环境出现
Из записей чата видно, что проблема по-прежнему ограничена условиями окружающей среды, и ее неудобно моделировать.Самое главное, что Фей Чао не может напрямую подключиться к среде своей компании, чтобы помочь ему увидеть проблему.
Если что-то пойдет не так, должен быть демон, плюс он жирная династияФанаты официального аккаунта(выделено мной), то может быть только волна ловли монстров!
смотреть и слышать
На самом деле, многие люди часто вздыхают после написания кода в течение нескольких лет.Это действительно легко писать код, то есть использовать различные фреймворки и стекировать программирование в стиле дерева.На самом деле причина, почему у них такой вздох, заключается в том, что проблем, возникающих в их работе, недостаточно настолько, чтобы они думали原理
,源码
Эти вещи - чисто отговорка интервью.
Конечно, недостаточно посмотреть исходный код, чтобы решить проблему, которую не может решить поисковая система.При высоком параллелизме будет много проблем, которые трудно воспроизвести.В это время вы должны освоить новый навык, то есть через лог, черезПодборка глаз,静态看源码
.
Поэтому я спросил и получил журнал ошибок следующим образом:
Как видно из журнала ошибок, эта ошибка также связана сMybatis plus
Это связано, но Фей Чао ничего не использовал.Mybatis plus
Ах, как это может быть хорошо?Не важно, как я уже говорил, смотрите исходники статически眼神编译!
, поэтому я начал создавать новую демонстрацию и вводить связанные зависимости.
Девять мелких и один глубокий
Снова отметьте стек исключений на рисунке выше.
Из отмеченных мною трех пунктов и простого английского начальной школы видно, что в анализеUserPersonalMapper.xml
, не найденBaseResultMap
Еще один момент, как видно по выделению в моей разметке, этоBaseResultMap
находится в другом XML, то естьUserMapper.xml
заявил в.
В это время некоторые друзья могут подумать, что он загружен?UserPersonalMapper.xml
когда,UserMapper.xml
Он еще не загружен, его невозможно найти.UserMapper.xml
ОпределенныйBaseResultMap
Откровенно говоря, в этом предположении нет ничего плохого, и оно весьма разумно.
Но самое главное, что локально запускать не проблема.Тогда почему я не получаю ошибки при локальном запуске, как вы это объясните?
Многие друзья спрашивали меня, как посмотреть исходный код, так что теперь я пойду рука об руку и перейду прямо к исходному коду по единственным подсказкам.
Журнал говорит нам, что ошибка была зарегистрирована в строке 583 (обведена на рисунке), а затемmapperLocations
Также очевидно, что мы настраиваем мою коллекцию мапперов, и он проходит каждый маппер из этой коллекции для анализа.
Далее следует ключевой вопрос.Мы смотрим код статически и компилируем глазами.Точку останова мы не можем сломать.Так когда же был установлен маппер,и какие значения были выставлены?Для того,чтобы передать мысли в любители официального аккаунта без оговорок сделаю скриншот процесса в деталях.
Следующие техники полностьюIDEA
проблемы с использованием
1. Посмотрите, на какие переменные ссылаются
2. Посмотрите, где вызывается метод
Наконец, давайте найдем основную логику обработки
отresolveMapperLocations
иPathMatchingResourcePatternResolver
И имя класса, и возвращаемое значениеResource[]
, даже если разобрать слова и перевести их по одному, то наверное можно догадаться, это исходя из конфигурации/*.xml
Эта конфигурация находит все ресурсы xml.Resource[]
Это массив, и массив упорядочен, поэтому порядок элементов (сопоставителя) в этом массиве может определить, верна ли наша предыдущая гипотеза.
Проверить гипотезу
Поэтому я попросил друга добавить этот журнал, чтобы проверить догадку.
Затем он отправляет журнал, который может быть запущен в обычном режиме, и ненормальный журнал, как показано ниже.
Мы обнаружили, что, как мы и ожидали, действительно возникла проблема с порядком загрузки, он запустился ненормально,UserMapper.xml
Он загружается в конце, что, естественно, приводит к тому, что xml анализируется в конце обхода, поэтому определение этого xmlBaseResultMap
не может использоваться ранее загруженным
Но ключевой вопрос, до сих пор не понятно, почему локально проблем нет, почему порядок загрузки и запуска локально в норме?
Объясните простым языком
Сейчас размах очень маленький.Мы постепенно сузили цель от предыдущей гипотезы до проверочной гипотезы.Теперь осталась только одна проблема,пока в ней разберемсяPathMatchingResourcePatternResolver
логика, все становится ясно
Поскольку онлайн-среда запускается как зависимость jar, а локальный класс — это класс, поэтому ветвь кода, которую они выбирают, отличается.
думать глубоко
Когда вы смотрите на проблему, вы должны глубоко задуматься. Например, здесь следует задать вопрос, почему Фей Чао знает. Они следуют разным ветвям. Кроме того, мужские клятвы ложны, как я узнаю, что то, что сказал Фей Чао, правда? .
Откровенно говоря, лучшее время для того, чтобы обратить внимание на династию Фей, было два года назад, а второй сейчас.Если вы начнете обращать внимание на династию Фей из серии анализа исходного кода, вы будете обучены.眼神编译,静态看源码
способность, тут естественно такого вопроса нет
Если вы, к сожалению, пропустите лучшее время, чтобы обратить внимание, я дам вам еще один непристойный метод.PathMatchingResourcePatternResolver
Скопируйте этот класс и измените его имя, напримерFeichaoPathMatchingResourcePatternResolver
, Затем добавьте простую информацию журнала, как показано ниже.
Затем вы начинаете локально, и банка запускается, и вы видите вывод журнала.
Итак, чем же отличаются эти две ветки?В кодовой ветке этого локального кода есть очень важная логика.
Он будет сортировать по файлам ресурсов здесь, так какие правила используются для сортировки?
Давайте взглянем на общие инструменты разработки, представленные в предыдущих статьях Фей Чао.
В это время вдруг стало ясно.Почему не воспроизвелся локально?Потому что при локальном запуске логика кода,которую он прошел,по умолчанию уже отсортировала файлы ресурсов по имени файла,что и привело к этомуUserMapper.xml
всегда тамUserPersonalMapper.xml
загружен раньше.
Разработка спецификации, отказ от случайного успеха
Откровенно говоря, эти дваmapper
Я думаю, что практика цитирования очень нерегулярна, потому что файл ресурсов заносится в банку.сортировка файловЭто очень неуправляемо, это может быть связано с различными инструментами сборки, такими какMaven
,Gradle
, и даже версия инструмента сборки, например версия Maven, также может зависеть от среды, такой как windows, linux и т. д. Причина, по которой при локальной разработке не было обнаружено проблем, — чисто случайный успех. использовать простой изJDK Api
Проверяем проблему.Возьмем банку которая может нормально запуститься и сообщить об ошибке
Очевидно, что порядок файлов ресурсов в этих двух банках разный, так что если по егоmapper
Метод записи может появиться из-за того, что версия maven среды A относительно высока, оптимизация и другие факторы, значение по умолчанию вводится в банку в соответствии с порядком имени файла, но в другой среде B ресурсы, введенные в банку, отсутствуют. Когда придет время, описание проблемы может стать очень загадочным: «один и тот же код, упаковка и запуск среды A были успешными, а упаковка и запуск среды B время от времени терпят неудачу». Это термин I часто упоминают в коллективе, случайный успех.
напиши в конце
Feichao — это технический публичный аккаунт, в котором основное внимание уделяется принципам, исходному коду и навыкам разработки, оригинальному тематическому анализу исходного кода в аккаунте и реальному сражению принципов исходного кода в реальных сценах (ключевые моменты).Отсканируйте QR-код нижеОбратите внимание на Фей Чао, пусть те, кто должен строить ракеты, перестанут трахаться!