在 Magnolia CMS 中创建 Java 模型

Posted

技术标签:

【中文标题】在 Magnolia CMS 中创建 Java 模型【英文标题】:Creating Java models in Magnolia CMS 【发布时间】: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

【问题讨论】:

【参考方案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!";
    

【讨论】:

以上是关于在 Magnolia CMS 中创建 Java 模型的主要内容,如果未能解决你的问题,请参考以下文章

Magnolia Cms Oracle 持久性

在 magnolia shop 模块中创建新产品

获取 magnolia cms 中执行的自定义操作的节点名称

如何在 Magnolia 中创建自定义表单处理器?

在 Magnolia 5.3 中创建独立模块

在 Magnolia CMS 上通过 Java 获取大坝资产链接