Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265

Swagger requred nullable

15.07.2025, 14:13. Показов 1281. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Вопрос такой, берём какое-либо ссылочное свойство делаем его нулабельным (в проекте где ссылочные типы по умолчанию не null) и помечаем required, вот так:
C#
1
public required MyClass? MyProperty {get; set;}
И Сваггер сгенерированный через Swashbuckle показывает что свойство это не только обязательное, но ещё и не допускающее null. Но это ведь не соответствует действительности! Null там очень даже допускается.
Что я только не пробовал, атрибуты на свойства вешал всякие (MaybeNull, AllowNull, SwaggerSchema(Nullable = true), JsonProperty(Required = Required.AllowNull)), потом стал пробовать через ISchemaFilter добраться и руками выставить.
Но через фильтр не получается получить информацию о том, помечен ли тип нулабельным или нет, для типов значений есть возможность, а для ссылочных - ничего не нашёл. Получилось только через имя типа выставить нулабельность, то есть я могу обозначить ВСЕ типы MyClass как нулабельные, но это не совсем то что мне нужно.
В общем, может кто-нибудь что-нибудь посоветовать в данном случае?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.07.2025, 14:13
Ответы с готовыми решениями:

Nullable и Actions параметры. Что настроено у вас?
Провожу глобальный рефакторинг в проекте который был мигрирован с AspNet5 на AspNetCore. И дошли...

Asp core swagger контроль отображения
Доброе утро. у меня есть страница api swagger, как сделать так чтобы она отображалась только для...

Для чего нужен Swagger?
Всем привет. Помогите по проекту. хочу разобраться: 4) Для чего нужен Swagger?

9
 Аватар для Midian
605 / 387 / 198
Регистрация: 31.03.2013
Сообщений: 2,687
15.07.2025, 22:26
Члены, обязательные для инициализации помечаются новым ключевым словом required, что дает возможность компилятору проверять, факт инициализации.
А зачем вы его помечаете так, если у вас он может быть null? Уберите этот required
1
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
16.07.2025, 06:18
Цитата Сообщение от Midian Посмотреть сообщение
А зачем вы его помечаете так, если у вас он может быть null? Уберите этот required
технически required обязывает проставлять свойство при создание экземпляра объекта, но не запрещает ему быть null.

C#
1
2
3
4
5
6
7
8
9
10
11
12
var neko = new Neko()
{
    Nya = null // без этого будет ошибка компиляции
};
 
var s = neko.Nya;
var l = s.Length; // предупреждение что neko.Nya может быть null и нужна проверка.
 
class Neko
{ 
    public required string? Nya { get; set; }
}
Это имеет смысл, типа мы гарантируем что создающий явно не пропустит простановку значения свойства, и если там таки null то укажет явно. По сути это аналог обычному конструктору с обязательным параметром

C#
1
2
3
4
class Neko(string? nya)
{ 
    public string? Nya { get; set; } = nya;
}
Добавлено через 3 минуты
Predatore, можно чуть подробностей, чтобы можно было потыкать:
- какой тип проекта? (asp.net core, или что там ещё)
- версия .net
- какая реализация Swagger используется?
0
 Аватар для Midian
605 / 387 / 198
Регистрация: 31.03.2013
Сообщений: 2,687
16.07.2025, 09:17
Цитата Сообщение от Wolfdp Посмотреть сообщение
но не запрещает ему быть null
Так оно по умолчанию null, зачем его инициализировать и проставлять туда снова null? Бессмысленно как-то в этом случае, это было бы верно, в случае если бы там был просто объект класса, но с null тип required теряет свою логику
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
16.07.2025, 10:51  [ТС]
Цитата Сообщение от Midian Посмотреть сообщение
Так оно по умолчанию null, зачем его инициализировать и проставлять туда снова null? Бессмысленно как-то в этом случае, это было бы верно, в случае если бы там был просто объект класса, но с null тип required теряет свою логику
Вот именно null по умолчанию, что может приводить (и поверьте приводит) к тому, что при разработке клиета свойство могут просто пропустить. И там всегда будет null даже когда его там быть не должно. А вот required гарантирует, что если там null то этот null проставлен осознанно, а не по умолчанию.
Wolfdp, всё верно описал.

Добавлено через 2 минуты
Цитата Сообщение от Wolfdp Посмотреть сообщение
Predatore, можно чуть подробностей, чтобы можно было потыкать:
- какой тип проекта? (asp.net core, или что там ещё)
- версия .net
- какая реализация Swagger используется?
ASP.Net core
.net 8, но на .net 9 тоже пробовал.
Про Swagger я вроде написал, что Swashbuckle. Последняя версия, хотя пробовал разные, мало ли... NSwag не пробовал.
upd. Попробовал ещё и .net 10 до кучи, хотя версия фреймворка вряд ли может влиять. Проблема скорее в самом генераторе.
Ещё в начале не упомянул, что вот такую шутку SupportNonNullableReferenceTypes в настройках генератора нашёл. Но она вообще как-то мало помогает. Из того что заметил, без неё string всегда nullable, вне зависимости от того нулабельный он на самом деле или нет, а с настройкой, начинает их различать. Но обычные ссылочные типы, за редкими специфическими исключениями, всё равно всегда помечены как не нулабельные, вне зависимости от настройки и от того нулабельны они на самом деле или нет.
1
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
16.07.2025, 11:51
Predatore, вечером постараюсь потыкать, самому интересно.

Пока у меня подозрение что данный финт ушами на C# не шибко укладывается в парадигму Swagger. В общем контракте нет возможности указать "поле может быть null, но пожалуйста обязательно его проставляй". Скорее всего Swashbuckle воспринимает ключевое слово required как "обязательное не пустое" и нужно как-то убедить его в обратном.

Т.е. по итогу в контракте будет обычное nulleble поле, и автокод на основе него создаст обычное свойство без required. По идеи не смертельно.
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
16.07.2025, 19:00  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
Пока у меня подозрение что данный финт ушами на C# не шибко укладывается в парадигму Swagger. В общем контракте нет возможности указать "поле может быть null, но пожалуйста обязательно его проставляй". Скорее всего Swashbuckle воспринимает ключевое слово required как "обязательное не пустое" и нужно как-то убедить его в обратном.
Т.е. по итогу в контракте будет обычное nulleble поле, и автокод на основе него создаст обычное свойство без required. По идеи не смертельно.
По итогду он ссылочные типы вообще не делает nullable, только не обязательными.
Мне тоже кажется, что Swagger не очень понимает что от него хотят, особенно учитывая что 100% нулабельные ссылочные типы он всё равно не хочет помечать как nullable. При этом он "позволяет" не указывать их, если они не обязательны, что можно интерпретировать как допускающие null, но на самом деле в схеме он не помечает их как nullable.
И при всём при этом, у него есть возможность проставить nullable любому типу. Как я уже писал, через ISchemaFilter у меня получается выставить nullable любому типу по его имени, то есть я могу там сказать что вот всем типам MyClass ставь nullable и это работает. Так же там могу по рулить типами Nullable<T>, то есть всякими int?, DateTime? и прочими не ссылочными типами. А вот со ссылочными беда, ни в Схеме ни в Контексте я не нахожу информации о том объявлен ли ссылочный тип нулабельным или нет. Подозреваю что именно из-за отсутствия этой информации и сам Swagger так чудит, ведь Nullable<T> он может корректно отображать, видимо потому что в Контексте они объявлены именно как Nullable<T>, то есть чётко видно что тип допускает null.
К сожалению, подозреваю, что нужно ждать пока в ISchemaFilter начнут прокидывать ифнормацию и о том объявлен ли ссылочный тип как nullable, но тогда скорее всего всё само заработает как нужно )
Типы DateOnly и TimeOnly в Swagger тоже не сразу заработали как нужно.
Ну или нужно влезть куда-то ещё перед ISchemaFilter и передать самому туда признак нулабельности для ссылочного типа, но мне кажется это нужно залезать куда-то в потроха Swashbuckle, к этому я пока не готов )
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
20.07.2025, 00:14
Заставил себя таки сесть потыкать...

1. required судя по всему реально воспринимает как аналог атрибуту. Можно смело заводить баг-репорт разрабам либы, но что-то мне подсказывает что они будут не согласны с тем что это вообще проблема. Наверное лучше всего не практиковать ключевое слово required вообще для моделей что будут участвовать в OpenAPI

2. в json контракте отдаваемым свагером есть массив required где вписываются эти поля. Технически через фильтр можно отсеивать все nulleble элементы, как-то так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class IgnoreRequiredFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (schema.Required is null)
            return;
 
        var required = schema.Required.ToArray();
 
        foreach (var p in required)
        {
            var pi = context.Type.GetProperties()
                .Single(x => x.Name.ToLower() == p);
            if (Nullable.GetUnderlyingType(pi.PropertyType) is not null
                || IsNullableReferenceType(pi))
            {
                schema.Required.Remove(p);
            }
        }
    }
 
    public static bool IsNullableReferenceType(PropertyInfo property)
    {
        if (property.PropertyType.IsValueType)
            return false;
 
        var context = new NullabilityInfoContext();
        var nullability = context.Create(property);
        return nullability.WriteState == NullabilityState.Nullable;
    }
}
У меня большие сомнения что учёл все, IsNullableReferenceType вообще писала нейронка, так что юзайте на свой страх и риск.

3. По умолчанию свагер почему-то всем типам лепит "обязательное", так что пришлось несколько подкрутить опции
C#
1
2
3
4
5
6
builder.Services.AddSwaggerGen(options =>
{
    options.SupportNonNullableReferenceTypes();
    options.UseAllOfToExtendReferenceSchemas();
    options.SchemaFilter<IgnoreRequiredFilter>();
});
4. Клиентский автокод на основе этого контракта не генерит изначальный класс (внезапно), но по крайне мере не прописывает поля как обязательные.

ниже прикрепил пример, на котором смотрел
Вложения
Тип файла: zip WebApplication1.zip (7.3 Кб, 0 просмотров)
1
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
22.07.2025, 02:25  [ТС]
Wolfdp, Спасибо!
Попробую тоже покрутить. Required.Remove это конечно не то что нужно, тут гораздо интереснее покрутить метод IsNullableReferenceType, что то подобное я пробовал, оно нифига не работало, но здесь метод немного отличается от того что я делал и если он рабочий, пусть и написан нейронкой, то это именно то что мне нужно, основная проблема с которой я столкнулся как раз и была в том, что я не мог выявить, является ли ссылочный тип нулабельным? Проверю работоспособность метода и отпишу.
0
Эксперт .NET
 Аватар для Wolfdp
3789 / 1766 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
22.07.2025, 05:44
Цитата Сообщение от Predatore Посмотреть сообщение
гораздо интереснее покрутить метод IsNullableReferenceType
на всякий, сейчас весь этот подход игнорирует любые атрибуты. Я думаю расширить в целом и сами сможете, чтобы учитывать и их.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.07.2025, 05:44
Помогаю со студенческими работами здесь

Подключение bearer token в swagger
Доброго времени суток! Подскажите как добавить bearer token в swagger? Мой код: using...

Проблема с Url swagger
Всем привет. Мне нужно было настроить документацию проекта с помощью сваггера, но я столкнулся с...

Как из Swagger убрать автозаполнение данных?
Есть вложенная модель public class ClientWithSpouseDto { public string? Name { get;...

Swagger перестал передавать данные на вход контроллера
Без видимых причин - контроллер не трогал, ничего в нём не менял - swagger перестал передавать...

Как работает Swagger?
За что отвечают эти строки? builder.Services.AddEndpointsApiExplorer(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru