2015-11-25 4 views
4

Я сделал кодирования в dataweava, какDataweave Ошибка для Null узлов

%dw 1.0 
%input payload application/xml 
%output application/xml skipNullOn="everywhere" 
--- 
{((payload.*Order default []) map { 
Order:{ 
    Channel:[email protected], 
    Code:[email protected], 
    Status:[email protected], 
    OrderLines: { 
    (($.OrderLines.*OrderLine default []) map { 
    OrderLine:{ 
     EntryNumber:"abc", 
     Status:[email protected], 

     (($.OrderStatuses.*OrderStatus default []) map { 

     ShipDate:[email protected] 

     }) 
    }})} 
} 

} 
) 
} 

Но ее дает ошибку при назначении входа в качестве

<?xml version="1.0" encoding="UTF-8"?> 
<Order EnterpriseCode="111" OrderNo="222" Status="Scheduled"> 
    <OrderLines> 
     <OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000"> 

     </OrderLine> 
    </OrderLines> 
</Order> 

Любые предложения здесь? Я пробовал default [], но он не работает. При присвоении null node его давая ошибку. Я попробовал фильтр, как filter ($ != '')

+1

Просьба представить пример ввода и вывода данных. – DavoCoder

+0

Какая ошибка? Это «Не могу принудить a: null к массиву: (com.mulesoft.weave.mule.exception.WeaveExecutionException).Полезная нагрузка сообщения имеет тип: LinkedList'? –

ответ

2

входного пример XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Order EnterpriseCode="111" OrderNo="222" Status="Scheduled"> 
    <OrderLines> 
    <OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000"> 
     <OrderStatuses> 
      <OrderStatus StatusDate="statusDate"></OrderStatus> 
      <OrderStatus StatusDate="statusDate"></OrderStatus> 
     </OrderStatuses> 
    </OrderLine> 
    <OrderLine PrimeLineNo="3" Status="Shipped3" OrderedQty="10003" ></OrderLine> 
    </OrderLines> 
</Order> 

Примечание: В вашем примере есть пробела между OrderLine открывающим тегом и закрывающим тэгом, вы должны это исправить:

<OrderLine PrimeLineNo="3" Status="Shipped3" OrderedQty="10003" ></OrderLine> 

Сценарий для передачи данных:

%input payload application/xml 
%output application/xml skipNullOn="everywhere" 
--- 
{ 
    ((payload.*Order default []) map { 
    Order:{ 
     Channel:[email protected], 
     Code:[email protected], 
     Status:[email protected], 

     OrderLines: { 
     (($.OrderLines.*OrderLine default []) map { 

      OrderLine:{ 
      EntryNumber:"abc", 
      Status:[email protected], 

      (($.OrderStatuses.*OrderStatus default []) map ((key,pos) -> { 
       ShipDate:[email protected] 
      }) when $!='' otherwise {}) 

      } 

     }) 
     } 


    } 
    }) 
} 

Вы не можете сопоставить значение, если оно не существует, поэтому вы должны использовать «когда/иначе», чтобы проверить существование элементов.

+0

Привет, Даво, Пробовал этот код, но он все еще выдавал ошибку, предоставляя этот вход ' <Заказ EnterpriseCode =" 111 "OrderNo =" 222 "Status = "Запланированный"> ' –

+0

Хорошо, я построил сценарий с пустым OrderLine, как это: с тегом встроенного тега. – DavoCoder

+0

Есть ли другой вариант для ввода, который я предоставил? –

0

Попробуйте следующее: Это должно решить вашу проблему. (Если нет/иначе) или (когда/иначе), любая комбинация может использоваться согласно вашему требованию. «Если нет», рекомендуется, если ShipDate присутствует в большинстве случаев, иначе замените «если нет» на «когда».

%dw 1.0 
%input payload application/xml 
%output application/xml skipNullOn="everywhere" 
--- 
{ 
(
    (payload.*Order default []) map { 
     Order: { 
      Channel:[email protected], 
      Code:[email protected], 
      Status:[email protected], 
      OrderLines: { 
       (
        ($.OrderLines.*OrderLine default []) map ({ 
         OrderLine: { 
          EntryNumber:"abc", 
          Status:[email protected], 
          (
           ($.OrderStatuses.*OrderStatus) map { 
            ShipDate:[email protected] 
           } 
          ) 
         } 
        }) unless not $.OrderLines.*OrderLine.OrderStatuses? otherwise { 
         OrderLine: { 
          EntryNumber:"abc", 
          Status:[email protected]         
         } 
        } 
       ) 
      } 
     } 
    } 
) 
} 
+0

Привет JJ, этот код выглядит хорошо, поскольку работает для одной итерации ' <Заказать EnterpriseCode =" 111 "OrderNo =" 222 "Status =" Запланированный "> ', но код не для итерационных элементов OrderLine –

+0

Это не выполняется для ввода' < ? xml version = "1.0" encoding = "UTF -8 "?> ' –

0

Попробуйте следующие подходы:

  • использование "SkipNullOn" % выход приложения/XML skipNullOn = "везде"
  • Вы можете использовать при выполнении условия, как показано ниже yourField: "нуль", когда

payload.yourField == null otherwise payload.yourField

0

Предоставление ниже определения структуры из Mule Сообщение Объект имеет сообщение Inbound недвижимости Outbound недвижимости Payload Переменная Flow Переменная Session Переменная Приложение Исключение Payload

Когда разъем потока (прослушивает порт) получает полезную нагрузку его под названием Inbound конечная точка. Когда в потоке у нас есть соединитель, расположенный посредине, и отправьте полезную нагрузку на свою оконечную точку Oubound. Здесь все исходящие свойства, отправленные в поток исходящего трафика Http, становятся входящими в этот поток.

Подробнее см. Ниже.

https://docs.mulesoft.com/mule-user-guide/v/3.8/mule-message-structure.

 Смежные вопросы

  • Нет связанных вопросов^_^