На консоли ничего не печатается, потому что вы не подписались на decodedRequest
, поскольку мы знаем один из аспектов Reactive:
Ничего не происходит, пока вы не подпишетесь
blockquote> [ 1114] Но если вы сделаете это, вы увидите печатное тело на консоли, но ваш код не будет работать, потому что следующие операторы не смогут прочитать тело, и вы получитеIllegalStateException
( Разрешено только одному соединению получать подписчика. )
Итак, как ее решить?
- Создайте свою собственную оболочку для
ServerWebExchange
(пожалуйста, прочитайте об этом здесь: Как регистрировать тела запросов и ответов в Spring WebFlux )Регистрировать тела в
HttpMessageDecoder
. Например, если вы видитеAbstractJackson2Decoder
, вы найдете код, в котором Spring декодирует ваш буфер в объект и может записать его:
try { Object value = reader.readValue(tokenBuffer.asParser(getObjectMapper())); if (!Hints.isLoggingSuppressed(hints)) { LogFormatUtils.traceDebug(logger, traceOn -> { String formatted = LogFormatUtils.formatValue(value, !traceOn); return Hints.getLogPrefix(hints) + "Decoded [" + formatted + "]"; }); } return value; }
Этот вопрос долгое время не отмечался как ответ. Что ж, под ответом marc_s есть комментарии, объясняющие, что это невозможно. Я не хотел отмечать ответ marc_s как принятый, потому что комментарии говорят прямо противоположное, чем ответ. Итак, ответ таков: к сожалению, это невозможно.
Хм ... Я знаю, что это возможно, потому что я знаю, что мы делали это на предыдущей работе. Я не помню точно, как, хотя. Я считаю, что у нас был родительский проект, который мы использовали для наследования настроек, и был ручной шаг, посредством которого, если мы внесли изменения в applicationSettings в подпроекте, нам нужно было вручную скопировать изменения в родительский проект (но затем они были унаследованы всеми дочерними проектами).
Извините за отсутствие конкретики; Я не был тем, кто реализовал решение, и со временем оно стало для меня немного размытым. Однако я помню, что мы смогли это сделать, и я думаю, что мои воспоминания точны относительно того, как мы это делали.
Да, конечно, это возможно! Любой ConfigurationSection в любом из ваших файлов конфигурации может быть «выведен» с помощью атрибута configSource = «otherConfigFile.config».
Было бы еще лучше, если бы я мог заставить класс настроек использовать appSettings, а не applicationSettings.
Чтобы сделать это, вам нужно уйти от использования хороших визуальных классов «Настройки» в .NET и напрямую использовать ConfigurationManager. Таким образом, вы можете поместить свои настройки в
Marc
Если бы это был мой проект, я бы избавился от applicationSettings и переместил бы все в раздел appSettings. Значение applicationSettings заключается в том, что значения могут быть строго типизированы и доступны для Intellisense. Ни один из них не особенно выгоден для вашей ситуации. Конечно, этот большой хит в переносе всего не стоит, если вы все еще создаете настройки с помощью дизайнера.
Ваааай, опоздал с этим вопросом, но я только что бился головой о стену. этот. Оказывается, вы можете сделать это, но не для всего узла applicationSettings, вам нужно сделать каждый дочерний узел applicationSettings отдельно. Я получил волшебную информацию из нижней части статьи MSDN SectionInformation.ConfigSource .
<applicationSettings>
<TestWebApplication.Properties.Settings configSource="externalfile.config" />
</applicationSettings>
<TestWebApplication.Properties.Settings>
<setting name="AnotherSetting" serializeAs="String">
<value>Another setting value</value>
</setting>
</TestWebApplication.Properties.Settings>