Компонент сообщения Error Propagate / Transform не перезаписывает поведение Mule4 по умолчанию

Я создал свои потоки с помощью APIKIT Router. Основной поток raml + post: // XX flow. Основной поток и мой поток POSt имеют компоненты обработчика ошибок

ОСНОВНОЙ ПОТОК:

<flow name="raml-main">
        <http:listener  .....">
            <http:response statusCode="#[vars.httpStatus default 200]">
                <http:body ><![CDATA[ ]]></http:body>
                <http:headers><![CDATA[#[vars.outboundHeaders default {}]]]></http:headers>
            </http:response>
            <http:error-response statusCode="#[vars.httpStatus default 500]">
                <http:body ><![CDATA[#[output application/json --- error.description]]]> 
                     </http:body>
                <http:headers><![CDATA[#[vars.outboundHeaders default {}]]]> 
                            </http:headers>
            </http:error-response>
        </http:listener>

        <apikit:router config-ref="raml-config" />
        <error-handler>
            <on-error-propagate type="APIKIT:BAD_REQUEST">
                <logger level="INFO" doc:name="Logger" doc:id="aa51777e-c1c6-42d2-ba68-b51c45c9aeac" message="Im in MAIN FLOWWWW"/>
                <ee:transform xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd" doc:id="4f00abf2-0b58-419e-8d9a-d3ef60e356ac">
                    <ee:message>
                        <ee:set-payload><![CDATA[%dw 2.0
output application/json
---
{message: "BadMAIN request"}]]></ee:set-payload>
                    </ee:message>
                    <ee:variables>
                        <ee:set-variable variableName="httpStatus"><![CDATA[400]]></ee:set-variable>
                    </ee:variables>
                </ee:transform>
            </on-error-propagate>

ПОСЛЕ ПОТОКА

<flow name="post:\notifications:raml-config">
        <json:validate-schema doc:name="Validate schema" doc:id="e447c719-60e2-4f34-aeb9-0b446a1a5eda" schema="schemas/event.json"/>
        <choice>
.............................
        </choice>
        <error-handler >
              <on-error-propagate type="JSON:SCHEMA_NOT_HONOURED" enableNotifications="true" logException="true">
                <logger level="INFO" doc:name="Logger" doc:id="c818b292-5d89-48eb-aa8d-b7918daa8f0c" message="It is under post flow"/>
                <ee:transform xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd" doc:id="e8fb927d-edb8-405a-b853-600b4788b719">
                    <ee:message>
                        <ee:set-payload><![CDATA[%dw 2.0
output application/json
---
{message: "Bad Request"}]]></ee:set-payload>
                    </ee:message>
                    <ee:variables>
                        <ee:set-variable variableName="httpStatus"><![CDATA[400]]></ee:set-variable>
                    </ee:variables>
                </ee:transform>
            </on-error-propagate>

        </error-handler>
    </flow>

Если я обновляю полезную нагрузку в процессоре преобразования в потоке POST или основном потоке RAML, он никогда не отражается в выходных данных. Скажем, сейчас я получаю 400 неверных запросов.

В компоненте Transform, если я изменяю сообщение, я не получаю измененное сообщение.

Это почему?

<ee:message>

<ee:set-payload><![CDATA[%dw 2.0

output application/json

---

{message: "Bad Request USER ERRROR.."}]]></ee:set-payload>

</ee:message>

КОНФИГУРАЦИЯ RAML

/notifications:
  post:
    headers:
      Authorization:
        required: false
        type: string          

    responses:
      '200':
        description: OK
      '400':
        description: BAD REQUEST
      '401':
        description: NOT AUTHORIZED

person Ratha    schedule 07.05.2020    source источник


Ответы (2)


400 означает, что такой конечной точки нет. Это означает, что ваш поток никогда не вызывается. Есть еще одна конечная точка, которую ожидает Мул. К счастью, Mule сообщает, что URL-адрес неверен и какие URL-адреса он прослушивает. Нравится

INFO  2020-05-07 07:32:22,539 [http.listener.06 SelectorRunner] org.mule.service.http.impl.service.util.DefaultRequestMatcherRegistry: No listener found for request: (GET)/badurl
INFO  2020-05-07 07:32:22,539 [http.listener.06 SelectorRunner] org.mule.service.http.impl.service.util.DefaultRequestMatcherRegistry: Available listeners are: [([*])/console/*, ([*])/, ([*])/api/*]

Конечно, если вы попадете на другой сервер, другой порт или протокол, то об этом запросе ничего не узнает. Но, поскольку у вас есть ответ - 400, то вы, вероятно, попали на свой сервер.

https://simpleflatservice.com/mule4/Recognize400Error.html

Обработчик ошибок по умолчанию и ответ можно также установить в прослушивателе http в разделе Responses - Error Response.

введите здесь описание изображения

person Alex    schedule 07.05.2020
comment
Нет, мой поток не был выполнен ... Здесь произошло 400, потому что моя проверка схемы была неправильной (схема json), и она перешла к правильному компоненту обработчика ошибок, и мой ‹log› был напечатан // Он находится в потоке сообщений //, но сообщение не трансформируется, как я хочу .. не переопределяет ли маршрутизатор APIKIT любую пользовательскую реализацию? - person Ratha; 08.05.2020
comment
Это вызывает другую проблему: в преобразовании я установил выходной формат как json .. но клиент получает текстовый тип содержимого. - person Ratha; 08.05.2020
comment
Если я использую ‹Transform / set payload› components., Внутри ‹error-propogate›, в сообщение об ошибке не добавляется ни один тип полезной нагрузки / содержимого. Почему это так? - person Ratha; 08.05.2020
comment
ошибка-распространение означает, что он должен перейти к следующему обработчику ошибок. Вы не определили ни одного, поэтому он используется по умолчанию. По умолчанию полезная нагрузка изменяется на ошибку. Вкратце - используйте при продолжении ошибки - он не будет вызывать другие обработчики и сохранит любую полезную нагрузку, которую вы только что создали в этом обработчике. - person Alex; 08.05.2020
comment
Вы правы .. Если я использую error-continue, он устанавливает мою полезную нагрузку. Но если я использую ‹распространение ошибок› как я могу установить тип содержимого сообщения об ошибке ?. Моя первоначальная проблема заключается в том, что ошибка отправляется клиенту как текст / простой. Я хочу изменить его как json. Где настройка обработчика ошибок по умолчанию? Как я могу отменить это? У меня нет настроек глобального обработчика ошибок - person Ratha; 09.05.2020
comment
Можно изменить глобальный обработчик, но я предлагаю вам этого не делать. Попробуйте изменить отклик HTTP-слушателя, как я описал в отредактированном ответе - person Alex; 09.05.2020
comment
Спасибо, он работает, редактируя тело ответа на ошибку слушателя opton - person Ratha; 10.05.2020

Неверный запрос HTTP-ответа 400 означает, что HTTP-запрос не соответствует ожидаемому формату. Возможно, APIKit проверяет запрос на соответствие RAML. В этом случае APIKit вызовет ошибку и не будет выполнять поток post:\notifications:raml-config. Вы подтвердили, что поток выполняется, например, с помощью регистратора?

person aled    schedule 07.05.2020
comment
да .. поток был выполнен .. Я добавил ‹log› перед компонентом ‹transform› - person Ratha; 08.05.2020
comment
Здесь произошло 400, потому что моя проверка схемы была неправильной (схема json), и она перешла к правильному компоненту обработчика ошибок, и мой ‹log› был напечатан // Он находится в потоке сообщений //, но сообщение не преобразовано так, как я хотел .. имеет ли маршрутизатор APIKIT приоритет над любой пользовательской реализацией? - person Ratha; 08.05.2020
comment
Это вызывает другую проблему: в преобразовании я установил выходной формат как json .. но клиент получает текстовый тип содержимого. - person Ratha; 08.05.2020
comment
Я считаю, что здесь полностью опущен мой компонент ‹transform›. Всегда зависеть от моей конфигурации Raml? Тогда зачем использовать ‹transform› внутри блоков ‹onerror-spread / continue›? - person Ratha; 08.05.2020
comment
Если я использую ‹Transform / set payload› components., Внутри ‹error-propogate›, в сообщение об ошибке не добавляется ни один тип полезной нагрузки / содержимого. Почему это так? - person Ratha; 08.05.2020