2016-05-16 4 views
0

У меня есть объект JSON для трансформатора объекта, который следует за datamapper в рабочем процессе Mule 3.6 и обнаружил, что JSON для трансформатора объекта удаляет конечный ноль в десятичных полях, поэтому 11.00 становится 11.0.Проблема округления Mule с трансформатором объекта JSON

Как я могу предотвратить превращение JSON в объект-трансформатор из последнего десятичного знака, если он равен нулю, и обеспечить соблюдение 2 десятичных знаков, чтобы он возвращал 11.00, поскольку это требование?

Пример потока показывает проблему:

<?xml version="1.0" encoding="UTF-8"?> 

<mule xmlns:file="http://www.mulesoft.org/schema/mule/file" xmlns:json="http://www.mulesoft.org/schema/mule/json" xmlns:data-mapper="http://www.mulesoft.org/schema/mule/ee/data-mapper" 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" version="EE-3.6.1" 
    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/file http://www.mulesoft.org/schema/mule/file/current/mule-file.xsd 
http://www.mulesoft.org/schema/mule/ee/data-mapper http://www.mulesoft.org/schema/mule/ee/data-mapper/current/mule-data-mapper.xsd 
http://www.mulesoft.org/schema/mule/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd"> 
    <data-mapper:config name="CSV_To_JSON" transformationGraphPath="csv_to_json.grf" doc:name="CSV_To_JSON"/> 
    <flow name="deimal-point-flowFlow"> 
     <file:inbound-endpoint path="${file.unprocessed.location}" moveToPattern="#[message.inboundProperties['originalFilename']]" moveToDirectory="${file.unprocessed.location}" responseTimeout="10000" doc:name="File"> 
      <file:filename-regex-filter pattern="test.csv" caseSensitive="true"/> 
     </file:inbound-endpoint> 
     <data-mapper:transform config-ref="CSV_To_JSON" doc:name="CSV To JSON"/> 
     <json:json-to-object-transformer returnClass="java.util.Map" doc:name="JSON to Object"/> 
     <json:object-to-json-transformer returnClass="java.lang.String" mimeType="application/json" doc:name="Object to JSON"/> 
     <logger level="INFO" doc:name="Logger"/> 
    </flow> 
</mule> 

Файл test.csv выглядит следующим образом:

DeptID,Dept,Staff 
5LL/A,Human Resources,4.00 
+0

Я обнаружил, что я могу использовать объект-манипулятор jackson для сохранения двух десятичных знаков, но он меняет значения на строки. Есть ли способ использовать объект-манипулятор jackson, но сохранить значения полей в виде десятичных знаков? – user3165854

ответ

0

Вы можете создать свою собственную функцию, которая округляет данные, которые могут быть использованы по datamapper. Сначала добавьте конфигурацию в поток, чтобы расширить язык выражения.

<configuration doc:name="Configuration"> 
    <expression-language autoResolveVariables="true"> 
     <import name="dataformatter" class="com.utils.DataFormatter" /> 
     <global-functions > 
      def (value, places) { return dataformatter.round(value, places) } 
     </global-functions> 
     </expression-language> 
    </configuration> 



//package com.utils.DataFormatter 
public static double round(double value, int places) { 
    if (places < 0) throw new IllegalArgumentException(); 
    BigDecimal bd = new BigDecimal(value); 
    bd = bd.setScale(places, RoundingMode.HALF_UP); 
    return bd.doubleValue(); 
} 

С этого кода вы можете напрямую вызвать функцию и округлить ее должным образом.

Надеюсь, это поможет.

+0

Спасибо за ответ. Проблема заключается в преобразовании JSON в Object transformer. Выходной сигнал от datamapper показывает правильное округление, но затем теряет последнее десятичное место, когда JSON to Object transformer входит в игру. – user3165854