Программное использование M2Doc: ошибка в сгенерированном документе .docx

#java #m2doc

#java #m2doc

Вопрос:

Я пытаюсь использовать M2Doc программно, мне удалось сгенерировать мой .docx файл без ошибок в части проверки, но я получаю следующую ошибку в сгенерированном документе:

 {m:self.Name} Couldn't find the 'aqlFeatureAccess(org.eclipse.emf.common.util.URI.Hierarchical,java.lang.String)' service
  

«self.Name «часть — это то, что я написал в своем шаблоне.

Я думаю, мне не хватает какой-то ссылки на сервис, но я не знаю, как это исправить.

Переменная self является ссылкой на модель, основанную на созданной мной метамодели. Но я не уверен, что правильно импортировал его в свой код.

Я основал свой код на коде, который я нашел на веб-сайте M2Doc некоторый код, который я нашел на их GitHub, особенно в отношении того, как добавить службу в среду запросов.

Я искал в исходном коде acceleo и M2Doc, чтобы посмотреть, какие службы они добавляют, но, похоже, они уже импортируют все службы, которые я использую.

Как я уже сказал, часть проверки проходит хорошо и не генерирует файл проверки.

     public static void parseDocument(String templateName) throws Exception{
        final URI templateURI = URI.createFileURI("Template/" templateName "." M2DocUtils.DOCX_EXTENSION_FILE);
        final IQueryEnvironment queryEnvironment = 
                org.eclipse.acceleo.query.runtime.Query.newEnvironmentWithDefaultServices(null); 
        final Map<String, String> options = new HashMap<>(); // can be empty
        M2DocUtils.prepareEnvironmentServices(queryEnvironment, templateURI, options); // delegate to IServicesConfigurator

        prepareEnvironmentServicesCustom(queryEnvironment, options);

        final IClassProvider classProvider = new ClassProvider(ClassLoader.getSystemClassLoader()); // use M2DocPlugin.getClassProvider() when running inside Eclipse
        try (DocumentTemplate template = M2DocUtils.parse(templateURI, queryEnvironment, classProvider)) {
            ValidationMessageLevel validationLevel = validateDocument(template, queryEnvironment, templateName);
            if(validationLevel == ValidationMessageLevel.OK){
                generateDocument(template, queryEnvironment, templateName, "Model/ComplexKaosModel.kaos");
            }
        }
    }
  
     public static void prepareEnvironmentServicesCustom(IQueryEnvironment queryEnvironment, Map<String, String> options){

        Set<IService> services = ServiceUtils.getServices(queryEnvironment, FilterService.class);
        ServiceUtils.registerServices(queryEnvironment, services);

        M2DocUtils.getConfigurators().forEach((configurator) -> {
            ServiceUtils.registerServices(queryEnvironment, configurator.getServices(queryEnvironment, options));
        });
    }
  
     public static void generateDocument(DocumentTemplate template, IQueryEnvironment queryEnvironment,
            String templateName, String modelPath)throws Exception{

        final Map<String, Object> variable = new HashMap<>();
        variable.put("self", URI.createFileURI(modelPath));
        final Monitor monitor = new BasicMonitor.Printing(System.out);
        final URI outputURI = URI.createFileURI("Generated/" templateName ".generated." M2DocUtils.DOCX_EXTENSION_FILE);
        M2DocUtils.generate(template, queryEnvironment, variable, outputURI, monitor);
    }
  

Ответ №1:

Переменная «self» содержит URI:

 variable.put("self", URI.createFileURI(modelPath));
  

Вы должны загрузить свою модель и присвоить значение self элементу из вашей модели, используя что-то вроде:

 final ResourceSet rs = new ResourceSetImpl();
final Resource r = rs.getResource(uri, true);
final EObject value = r.getContents()...;
variable.put("self", value);
  

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

Комментарии:

1. Спасибо за ответ! Эта ссылка, в частности, очень помогла мне привязать XML к Java , я уже выполнил те же шаги для регистрации моей метамодели, но я не знал, что мне нужно сделать это и для моей модели, теперь это работает хорошо!