Mule 4 mới ra và có không ít vấn đề, mất nhiều thời gian chúng ta mới quen, mới biết hết được. Một trong những vấn đề mà mình đau đầu thời gian gần đây với Mule 4 là làm thế nào để thay đổi giá trị mặc định của XML Reader Properties “nullValueOn” cho DataWeave từ “blank” sang “none”.
Nói nôm na cho các bạn hiểu về thuộc tính “nullValueOn” thì thuộc tính này được sử dụng khi chúng ta transform data input dưới dạng XML sang bất kỳ output nào đó sử dụng DataWeave. Nội dung input XML data của chúng ta thì có thể có những tag không có (none), trống (blank) hãy rỗng (empty). Với Mule 3, mặc định giá trị của thuộc tính “nullValueOn” là “none”, có nghĩa là chỉ khi nào trong input XML data không có tag chúng ta mong muốn thì DaaWeave 1 sẽ coi tag đó có giá trị null. Nhưng trong Mule 4, vì giá trị mặc định của thuộc tính này là “blank”, có nghĩa là những tag mà không có giá trị, chỉ có tên tag, ví dụ như <id />, DataWeave 2 cũng sẽ coi tag đó có giá trị là null. Điều này có vẻ không hợp lý lắm vì dù gì trong trường hợp này, tag này vẫn tồn tại trong input data. Nhưng nếu xét về mặc ý nghĩa thì mình cũng cảm thấy hợp lý, vì nếu giá trị đã blank thì output ra để làm gì?…
Để các bạn có thể hiểu rõ hơn, mình có một ứng dụng viết trong Mule 3 như sau:
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 32 33 34 35 |
<?xml version="1.0" encoding="UTF-8"?> <mule xmlns:dw="http://www.mulesoft.org/schema/mule/ee/dw" xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd http://www.mulesoft.org/schema/mule/ee/dw http://www.mulesoft.org/schema/mule/ee/dw/current/dw.xsd"> <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration" /> <flow name="testFlow"> <http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP" /> <set-payload value="<st:student xmlns:st="http://huongdanjava.com/student/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://huongdanjava.com/student/ student.xsd "><id/><name>Khanh</name><address>Viet Nam</address></st:student>" mimeType="application/xml" doc:name="Set Payload" /> <dw:transform-message doc:name="Transform Message"> <dw:set-payload> <![CDATA[ %dw 1.0 %output application/xml writeNilOnNull=true %namespace ns0 http://huongdanjava.com/student/ --- { ns0#student: { id: payload.ns0#student.id, name: payload.ns0#student.name, address: payload.ns0#student.address } } ]]> </dw:set-payload> </dw:transform-message> </flow> </mule> |
Cũng ứng dụng này được viết trong Mule 4 như sau:
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 32 33 34 35 36 37 38 39 40 |
<?xml version="1.0" encoding="UTF-8"?> <mule xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd"> <http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" doc:id="442c5e6a-f3dd-4a25-a1e2-ace11dd562d1"> <http:listener-connection host="0.0.0.0" port="8081" /> </http:listener-config> <flow name="testFlow" doc:id="8ad12d74-a3c9-4527-bfa0-395c4c66a926"> <http:listener doc:name="Listener" doc:id="e603cbe1-a9b0-484d-bf54-9d1ca5af6898" config-ref="HTTP_Listener_config" path="/test" /> <set-payload value='<st:student xmlns:st="http://huongdanjava.com/student/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://huongdanjava.com/student/ student.xsd "><id/><name>Khanh</name><address>Viet Nam</address></st:student>' doc:name="Set Payload" doc:id="144b8106-24f3-427a-8142-2307f6fc7acd" mimeType="application/xml" /> <ee:transform doc:name="Transform Message" doc:id="8f455336-2b94-409a-b95f-1c1eec709149"> <ee:message> <ee:set-payload> <![CDATA[ %dw 2.0 output application/xml writeNilOnNull=true ns ns0 http://huongdanjava.com/student/ --- { ns0#student: { id: payload.ns0#student.id, name: payload.ns0#student.name, address: payload.ns0#student.address } } ]]> </ee:set-payload> </ee:message> </ee:transform> </flow> </mule> |
Cả 2 phiên bản của ứng dụng này đều có một endpoint HTTP Listener, một endpoint Set Payload với nội dung như sau:
1 2 3 4 5 |
<st:student xmlns:st="http://huongdanjava.com/student/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://huongdanjava.com/student/ student.xsd "> <id/> <name>Khanh</name> <address>Viet Nam</address> </st:student> |
và một endpoint Transform Message.
Kết quả khi chúng ta request tới địa chỉ http://localhost:8081/test của Mule 3 sẽ như sau:
Và Mule 4 sẽ là:
Các bạn có thể thấy sự khác biệt đúng không? Mule 4 đang consider tag <id> trong input data là null nên output một tag XML với nil=true.
Chúng ta có thể thay đổi giá trị default của thuộc tính “nullValueOn” cũng như các XML Reader Properties khác trong Mule 3 và Mule 4. Nhưng cách cấu hình của thuộc tính này cũng như các thuộc tính khác sẽ khác đối với Mule 3 và Mule 4.
Cụ thể:
Đối với Mule 3, thì trong nội dung của tag <dw:transform-message>, các bạn hãy thêm tag <dw:input-payload> nếu ứng dụng của các bạn chưa có, rồi trong tag <dw:input-payload> này, các bạn hãy thêm tag <dw:reader-property> với name là tên XML Reader mà các bạn muốn thay đổi giá trị mặc định. Ví dụ mình có thể cấu hình thuộc tính “nullValueOn” cho ứng dụng trên Mule 3 của mình như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<dw:transform-message doc:name="Transform Message"> <dw:input-payload> <dw:reader-property name="nullValueOn" value="blank" /> </dw:input-payload> <dw:set-payload> <![CDATA[ %dw 1.0 %output application/xml writeNilOnNull=true %namespace ns0 http://huongdanjava.com/student/ --- { ns0#student: { id: payload.ns0#student.id, name: payload.ns0#student.name, address: payload.ns0#student.address } } ]]> </dw:set-payload> </dw:transform-message> |
Request lại tới ứng dụng, các bạn sẽ thấy kết quả như trên Mule 4.
Đối với Mule 4 thì cách cấu hình hoàn toàn khác biệt.
Mule 4 dựa vào MIME Type của đối tượng input data và chúng ta sẽ cấu hình các XML Reader Properties sử dụng MIME Type này. Điều này có nghĩa, nếu mình muốn thay đổi giá trị mặc định của một thuộc tính của input data thì mình cần phải thay đổi MIME Type của input data đó. Ví dụ Mule 4 ở trên input data của mình là Payload, MIME Type hiện tại của nó là application/xml, điều chúng ta cần làm là thay đổi MIME Type này để thêm thuộc tính XML Reader Properties vào.
Các bạn hãy click vào endpoint Set Payload và mở tab Set Payload bên dưới:
sau đó, click vào tab MIME Type trong cửa sổ này rồi để thêm Parameter như sau:
Nội dung XML của endpoint Set Payload:
1 2 3 |
<set-payload value='<st:student xmlns:st="http://huongdanjava.com/student/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://huongdanjava.com/student/ student.xsd "><id/><name>Khanh</name><address>Viet Nam</address></st:student>' doc:name="Set Payload" doc:id="144b8106-24f3-427a-8142-2307f6fc7acd" mimeType="application/xml; nullvalueon=none" /> |
Các bạn có thể thấy, MIME Type của endpoint Set Payload đã được cấu hình thêm XML Reader Properties “nullValueOn” với “application/xml; nullvalueon=none”.
Chạy lại ví dụ để xem kết quả nhé các bạn! …
Một điều lưu ý là cách cấu hình của XML Reader Properties cũng có thể apply cho các MIME Type khác ví dụ như application/json đó các bạn!