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