Какова модель использования Smook и Freemarker для преобразования объектов Java в XML? - PullRequest
0 голосов
/ 07 июня 2018

У меня проблемы с поиском четкой документации о том, как выполнить следующее преобразование:

Объект Java -> Шаблон Smooks / Freemarker -> Вывод XML

Вот пример, который я пробую:

Java POJO (у меня есть отдельный класс DAO, который заполняет этот объект):

package Transformer;

public class JavaObject {
    String name; 
}

Класс основного преобразователя:

package Transformer;

import java.io.IOException;
import java.io.StringWriter;

import javax.xml.transform.stream.StreamResult;

import org.milyn.Smooks;
import org.milyn.container.ExecutionContext;
import org.milyn.payload.JavaSource;
import org.xml.sax.SAXException;

public class Transformer {

     protected static String runSmooksTransform(Object javaObject) throws IOException, SAXException {
        Smooks smooks = new Smooks("smooks-config.xml");
        try {
            ExecutionContext executionContext = smooks.createExecutionContext();
            StringWriter writer = new StringWriter();
            smooks.filterSource(executionContext, new JavaSource("smooks-config.xml"), new StreamResult(writer));
            return writer.toString();
        } finally {
            smooks.close();
        }
    }

    public static void main(String args[]) {
        try {
            Transformer.runSmooksTransform(javaObject);
        } catch(Throwable ex){
            System.err.println("Uncaught exception - " + ex.getMessage());
            ex.printStackTrace(System.err);
        }
    }
}

Итак, вот точка, в которой яя в замешательстве ... я видел несколько разных способов "сопоставить" шаблон

вот несколько примеров, которые я видел:

Файл шаблона .ftl с отображением, подобным этому:

     <Nm> ${Name} </Nm>

XML-отображение, подобное этому:

    <medi:segment minOccurs="0" maxOccurs="1" segcode="" xmltag="Group">
                <medi:field xmltag="Name" />
    </medi:segment>

Отображение в самом файле smooks-config.xml:

 <?xml version="1.0"?>
 <smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.0.xsd" 
 xmlns:ftl="http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd">

     <resource-config selector="global-parameters">
         <param name="stream.filter.type">SAX</param>
     </resource-config>

     <reader mappingModel="example.xml" />

     <ftl:freemarker applyOnElement="order">
         <ftl:template>
           <Nm>${name}</Nm>
         </ftl:template>
     </ftl:freemarker>

 </smooks-resource-list>

Так может кто-нибудь объяснить, пожалуйста, правильный способиспользовать Smooks + шаблон Freemarker для преобразования java-объекта в указанный вывод XML?

Или указать мне документацию / пример специфичный для этого варианта использования?

Спасибо

1 Ответ

0 голосов
/ 08 июня 2018

Я ничего не знаю о том, как это делается в Smooks, но очень вероятно, что вам нужно добавить public String getName() { return name; } в класс JavaObject, иначе он не будет виден из шаблона FreeMarker.На самом деле это зависит от настроек конфигурации FreeMarker (и я не знаю, как Smooks настраивает его), поэтому в теории все возможно, но вполне вероятно, что вам нужен метод получения, но если нет, то по крайней мере поле должно быть public.

Также вы не передаете javaObject Smooks в вашем примере кода, хотя я полагаю, что это не настоящий код.

...