在 Magnolia CMS 中创建 Java 个模型

Creating Java models in Magnolia CMS

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

我想创建 Java 模型来访问外部数据库并添加业务逻辑,但无法找到创建 classes 的位置,而且这方面的文档并不详尽。

在 Netbeans IDE 中,项目树中没有出现 src 目录。当我创建一个包和一个 jave class 时,我在 tomcat:

中收到错误

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

我应该在哪里创建 classes ?

更新:

我在单独的 Java 项目中创建了 classes,并在 web-inf/lib 中放置了一个 jar。 现在我没有收到丢失的 class 错误,但收到渲染转换错误

Class:

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:

我修改了 class 以将 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

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

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

改版后: 结果是您尝试注入一个需要扩展的模型 class RenderingModelImpl 在您尝试分配的特定模型 class 中。

干杯,

我在 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!";
    }
}