fix(types): контракты обработчиков сервиса живут на типе самого сервиса - #4437
Conversation
У модуля сервиса есть владелец — сам сервис, и обработчики объявлены только в нём. Синтакс-помощник этого не выражает: у него один тип на вид сервиса («Модуль Web-сервиса») с единственным членом-шаблоном «<Имя обработчика>» и без параметра в имени типа — в отличие от справочников, где параметризовано само имя («СправочникМенеджер.<Имя справочника>»). Регистратор следовал этому буквально и складывал обработчики всех сервисов конфигурации на один тип. На ssl_3_1 это 143 операции тринадцати веб-сервисов, схлопнутые в 47 членов: 41 имя объявлено больше чем одним сервисом, а у 16 имён наборы параметров различаются — у версий одного сервиса операции называются одинаково, но принимают разное. Побеждал контракт того сервиса, что попался раньше, а обработчики остальных объявлялись несоответствующими. Кто попадётся раньше, решал порядок обхода метаданных. Теперь на каждый сервис регистрируется свой тип модуля («Модуль Web-сервиса.Обмен») специализацией от HBK-шаблона, с операциями только этого сервиса, а EventHandlerResolver спрашивает сперва тип конкретного сервиса и лишь потом общий. На ssl_3_1: EventHandlerInvalidSignature 557 → 519, ни одного нового; убранные 38 — это обработчики, которые проверялись по чужому контракту. Три проверки в ConfigurationTypesProviderHelpersTest спрашивали члены у общего типа вида — они спрашивают их у типа сервиса: контракт переехал туда намеренно. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughService event registration now creates metadata-qualified module types for each service. Event resolution checks these types before generic service types. Tests cover distinct operation contracts, generic fallback, and HTTP, Web, and integration service names. ChangesService-specific event contracts
Estimated code review effort: 3 (Moderate) | ~25 minutes Possibly related PRs
Sequence Diagram(s)sequenceDiagram
participant ServiceModuleEventRegistrar
participant MetadataService
participant TypeRegistry
participant SpecializedServiceType
ServiceModuleEventRegistrar->>MetadataService: collect handlers for one service
ServiceModuleEventRegistrar->>TypeRegistry: resolve generic module type
TypeRegistry->>SpecializedServiceType: create specialized type
ServiceModuleEventRegistrar->>SpecializedServiceType: register handlers
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Test Results 4 056 files 4 056 suites 50m 40s ⏱️ Results for commit cee0284. |
| */ | ||
| class ServiceModuleEventRegistrarTest { | ||
|
|
||
| private static final String WEB_SERVICE_MODULE = "Модуль Web-сервиса"; |
There was a problem hiding this comment.
Нужны тесты так же на ХТТП сервисы и сервисы интеграций
По замечанию в ревью: проверки были только на веб-сервисы. Добавлены такие же на HTTP-сервисы и сервисы интеграции — одноимённые обработчики разных сервисов остаются каждый при своём типе, а общие типы вида обработчиков не получают. Заодно замечания Sonar по этому файлу: лишний импорт, статический импорт verify вместо полного имени, ссылка на метод вместо лямбды, слитые проверки одного предмета. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Спасибо, поправил. По ревью — добавил такие же проверки на HTTP-сервисы и сервисы интеграции: одноимённые обработчики разных сервисов остаются каждый при своём типе, а общие типы вида ( По Sonar — все четыре замечания были в этом же тесте и устранены: лишний импорт |
|



Проблема
У модуля сервиса есть владелец — сам сервис, и обработчики объявлены только в нём. Синтакс-помощник этого не выражает. Сырые данные из HBK (8.3.26.1521, через bsl-context):
У справочников платформа параметризует имя типа и прямо пишет об этом в описании. У модулей сервисов параметризовано только имя члена, а тип один на вид сервиса. Это не потеря в bsl-context:
BslContextPlatformTypesProviderберётcontext.typeParameters()как есть, и у справочника параметр приходит.Типа «сам сервис» в HBK тоже нет: есть
СервисИнтеграцииМенеджер.<Имя сервиса интеграции>,КаналСервисаИнтеграцииМенеджер.<…>,WSСсылкаМенеджер.<Имя WS-Ссылки>— но ниWebСервисМенеджер.<…>, ниHTTPСервисМенеджер.<…>. К веб-сервису конфигурации из кода не обратиться, поэтому типа-значения у него нет;ОбъектМетаданных: WebСервис— это описание метаданных, а не сервис.ServiceModuleEventRegistrarследовал HBK буквально: собирал обработчики всех сервисов конфигурации и материализовал их на одном типе, разрешая столкновения имён так:Насколько это массово (ssl_3_1)
Пример:
СоздатьУзелОбменавExchange_3_0_1_1принимаетParameters, вExchange_3_0_2_1—Parameters, Zone. Контракт доставался тому, чей объект метаданных попался раньше, а обработчики остальных сервисов объявлялись несоответствующими. Порядок обхода метаданных между запусками не гарантирован, поэтому и набор замечаний плавал: в замерах по ишью #4429 ровно эти строки расходились между прогонами.Что сделано
На каждый сервис регистрируется свой тип модуля —
Модуль Web-сервиса.Обмен— специализацией от HBK-шаблона, с операциями только этого сервиса и их настоящими параметрами.EventHandlerResolver.resolveOwnerTypeспрашивает сперва тип конкретного сервиса и лишь потом общий тип вида (запасной путь на случай, когда метаданные сервиса не прочитались).Одинаково для всех трёх видов: Web-сервисы, HTTP-сервисы, сервисы интеграции.
Замеры на ssl_3_1
EventHandlerInvalidSignatureУбрано 38, добавлено 0 — все убранные приходятся на обработчики, проверявшиеся по контракту чужого сервиса (
WebServices/Exchange,EnterpriseDataUpload_1_0_1_1и т. д.).Тесты
Новые:
ServiceModuleEventRegistrarTest— два сервиса с одноимённой операцией и разными параметрами сохраняют каждый свой контракт, на общий тип обработчики не попадают; вEventHandlerResolverTest— контракт берётся у своего сервиса, а не у чужого, и запасной путь на общий тип.Правлены: три проверки в
ConfigurationTypesProviderHelpersTestспрашивали члены у общего типа вида — теперь спрашивают у типа сервиса. Контракт переехал туда намеренно, это и есть суть правки.Замечание на будущее:
Модуль командыиМодуль ботатоже сидят на фиксированном типе, но у них имена событий не параметризованы (ОбработкаКомандыи пять событий бота), поэтому сталкиваться нечему — их не трогал.Summary by CodeRabbit
Bug Fixes
Tests