【问题标题】:Creating Java models in Magnolia CMS在 Magnolia CMS 中创建 Java 模型
【发布时间】:2020-03-11 13:08:12
【问题描述】:

我使用 maven 安装了 Magnolia,并成功构建和部署了项目。我还可以创建 yaml 模板和组件。

我想创建 Java 模型来访问外部数据库并添加业务逻辑,但找不到在哪里创建类,并且该领域的文档并不广泛。

在 Netbeans IDE 中,项目树中没有 src 目录。当我创建一个包和一个 jave 类时,我在 tomcat 中得到一个错误:

问题详情:由于缺少类而无法解析类属性:[newpackage.NewClass]

我应该在哪里创建类?

更新:

我在一个单独的 Java 项目中创建了这些类,并在 web-inf/lib 中放置了一个 jar。 现在我没有得到缺少的类错误,而是得到一个渲染转换错误

类:

package com.example;
public class NewClass  {

    public String getText() {
       return "Hello Magnolia!";
    }

}

YAML:

modelClass: com.example.NewClass

模板:

<h1>${model.getText()}</h1>

错误:

RenderException: java.lang.ClassCastException: com.example.NewClass 无法转换为 info.magnolia.rendering.model.RenderingModel

更新 2:

我修改了类以将 magnolia RenderingModelImpl 扩展为:

package com.example;

import info.magnolia.module.templating.RenderingModel;
import info.magnolia.module.templating.RenderingModelImpl;
import info.magnolia.rendering.template.configured.ConfiguredTemplateDefinition;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;

public class NewClass extends RenderingModelImpl {

    public NewClass(Node content, ConfiguredTemplateDefinition definition, RenderingModel<?> parent) throws PathNotFoundException, RepositoryException {
        super(content, definition, parent);
    }

    public static String getText() {
        return "Hello World!";
    }

}

现在构造函数中的super语句不编译显示和报错:

incompatible types: Node cannot be converted to Content

【问题讨论】:

    标签: magnolia


    【解决方案1】:

    请查看以下文档页面: https://documentation.magnolia-cms.com/display/DOCS61/How+to+use+Magnolia+Maven+archetypes

    在那里你会找到关于 Maven 原型的信息,还有一个关于如何创建自定义 java 模块的部分。创建后,您还必须将其添加到您的网络应用中。

    改版后: 原来你试图注入一个你需要扩展的模型类 RenderingModelImpl 在您尝试分配的特定模型类中。

    干杯,

    【讨论】:

    • 我尝试将模块制作为常规 jar 以及由 maven archetype magnolia-module 生成的 jar,但我仍然无法在模板中包含自定义类,出现以下错误并且有文档站点上没有示例:RenderException: java.lang.ClassCastException: package.className cannot be cast to info.magnolia.rendering.model.RenderingModel
    • 可以分享一下课程吗?
    • 我编辑了原始问题并添加了课程。
    • 你必须在运行时将 RenderingModelImpl 类扩展为它知道它是 modelClass 的一个实例
    • 我扩展了 RenderingModelImpl,现在在构造函数上收到错误。我用我的代码更新了原始问题。
    【解决方案2】:

    我在 github 上的 this link 找到了一个工作示例,并从那里对其进行了修改。以下 Java 模型工作正常并返回了我可以渲染的字符串:

    package com.example;
    
    import info.magnolia.rendering.model.RenderingModel;
    import info.magnolia.rendering.model.RenderingModelImpl;
    import info.magnolia.rendering.template.RenderableDefinition;
    
    
    import javax.inject.Inject;
    import javax.jcr.Node;
    
    
    
    public class NewClass<RD extends RenderableDefinition> extends RenderingModelImpl {
    
        @Inject
        public NewClass(Node content, RD definition, RenderingModel<?> parent) {
            super(content, definition, parent);
    
        }
    
        @Override
        public String execute() {
            return super.execute();
        }
    
        public String getName() {
        return "Hello Magnolia!";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      相关资源
      最近更新 更多