Java 如何从ftl中的json(从XML转换)中获取嵌套值
在java中从json访问嵌套值时遇到了一些困难。 让我先告诉你我做这件事的过程 首先,我将输入作为XML文件,然后将其转换为JSONObject 下面是我尝试从FTL HTMLMakerDemoJava 如何从ftl中的json(从XML转换)中获取嵌套值,java,arrays,json,xml,freemarker,Java,Arrays,Json,Xml,Freemarker,在java中从json访问嵌套值时遇到了一些困难。 让我先告诉你我做这件事的过程 首先,我将输入作为XML文件,然后将其转换为JSONObject 下面是我尝试从FTL HTMLMakerDemo package com.imoveinvest.propertyuploader; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; im
package com.imoveinvest.propertyuploader;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Serializable;
import java.io.Writer;
import org.json.JSONObject;
import org.json.XML;
import org.springframework.stereotype.Service;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
@Service
public class PDFGenerationDemo implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public static final String RESOURCES_DIR;
public static final String OUTPUT_DIR;
static {
RESOURCES_DIR = "src//main//resources//";
OUTPUT_DIR = "src//main//resources//output//";
}
public void makeHTML() throws IOException, TemplateException {
String line = "", str = "";
BufferedReader br = new BufferedReader(new FileReader(RESOURCES_DIR +
"sample.xml"));
while ((line = br.readLine()) != null) {
str += line;
}
JSONObject root = XML.toJSONObject(str);
JSONObject section = (JSONObject)root.get("property-valuation-report");
section.put("data", section);
PDFGenerationDemo pdf = new PDFGenerationDemo();
pdf.makeTemplate(section);
}
public void makeTemplate(JSONObject obj) throws TemplateException{
Configuration cfg = new Configuration();
cfg.setObjectWrapper(new JSONArrayObjectWrapper());
cfg.setClassForTemplateLoading(this.getClass(), "/templates/");
try {
Template sampleTemplate= cfg.getTemplate("sampleTemplate.ftl");
Writer consoleWriter = new OutputStreamWriter(System.out);
sampleTemplate.process(obj, consoleWriter);
Writer fileWriter = new FileWriter(new File("output.html"));
sampleTemplate.process(obj, fileWriter);
} catch (IOException e) {
e.printStackTrace();
}
}
}
我的FTL是
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1>Deserialization with Freemarker Hash</h1>
<#assign obj = data.section>
<#list obj as item>
<#if item.name=="valuation">
<div>${item.capital-value}</div>
</#if>
</#list>
</body>
</html>
所以我的问题是在我的XML文件中,我有如下标记
资本价值
<?xml version="1.0" encoding="utf-8"?>
<sample-data xmlns:ms="urn:schemas-microsoft-com:xslt" xmlns:ht="urn:hometrack.com/xslt/extensions">
<section name="valuation">
<capital-value>
<from>855000</from>
<to>1045000</to>
<accuracy>medium</accuracy>
<value>950000</value>
<valuation-date>2020-02-12T00:00:00</valuation-date>
</capital-value>
<last-recorded-sale />
<rental-value>
<value>2720</value>
<yield>3.4357894736842107</yield>
</rental-value>
<location>
<lat>51.611573777232579</lat>
<long>-0.32247146663868992</long>
</location>
</section>
</sample-data>
855000
1045000
中等的
950000
2020-02-12T00:00:00
2720
3.4357894736842107
51.611573777232579
-0.32247146663868992
所以当你看我的ftl时,你会发现我写了
<div>${item.capital-value}</div>
${item.capital value}
这给了我类似的错误
freemarker.core._TemplateModelException: An error has occurred when reading existing sub-variable "capital"; see cause exception! The type of the containing value was: extended_hash+string (org.json.JSONObject wrapped into f.e.b.StringModel)
----
FTL stack trace ("~" means nesting-related):
- Failed at: ${item.capital - value} [in template "sampleTemplate.ftl" at line 8, column 38]
----
at freemarker.ext.beans.BeanModel.get(BeanModel.java:186)
at freemarker.core.Dot._eval(Dot.java:43)
at freemarker.core.Expression.eval(Expression.java:81)
at freemarker.core.Expression.evalToNumber(Expression.java:118)
at freemarker.core.ArithmeticExpression._eval(ArithmeticExpression.java:51)
at freemarker.core.Expression.eval(Expression.java:81)
at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:96)
at freemarker.core.DollarVariable.accept(DollarVariable.java:59)
at freemarker.core.Environment.visit(Environment.java:326)
at freemarker.core.Environment.visit(Environment.java:368)
at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:315)
at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271)
at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:242)
at freemarker.core.Environment.visitIteratorBlock(Environment.java:595)
at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:107)
at freemarker.core.IteratorBlock.accept(IteratorBlock.java:93)
at freemarker.core.Environment.visit(Environment.java:326)
at freemarker.core.Environment.visit(Environment.java:332)
at freemarker.core.Environment.process(Environment.java:305)
at freemarker.template.Template.process(Template.java:378)
at com.imoveinvest.propertyuploader.PDFGenerationDemo.makeTemplate(PDFGenerationDemo.java:57)
at com.imoveinvest.propertyuploader.PDFGenerationDemo.makeHTML(PDFGenerationDemo.java:46)
at com.imoveinvest.propertyuploader.controller.SaveOrValidateValuationReport.htmlCall(SaveOrValidateValuationReport.java:152)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:1487)
at freemarker.ext.beans.BeanModel.invokeGenericGet(BeanModel.java:268)
at freemarker.ext.beans.BeanModel.get(BeanModel.java:155)
... 64 common frames omitted
Caused by: org.json.JSONException: JSONObject["capital"] not found.
at org.json.JSONObject.get(JSONObject.java:473)
... 71 common frames omitted
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1>Deserialization with Freemarker Hash</h1>
<div>FreeMarker template error (DEBUG mode; use RETHROW in production!):
freemarker.core.\u TemplateModelException:读取现有子变量“capital”时出错;查看原因异常!包含值的类型是:extended_hash+string(org.json.JSONObject包装到f.e.b.StringModel中)
----
FTL堆栈跟踪(“~”表示嵌套相关):
-在:${item.capital-value}[第8行第38列的模板“sampleTemplate.ftl”中]失败
----
在freemarker.ext.beans.BeanModel.get(BeanModel.java:186)上
在freemarker.core.Dot.\u eval(Dot.java:43)
位于freemarker.core.Expression.eval(Expression.java:81)
位于freemarker.core.Expression.evalToNumber(Expression.java:118)
在freemarker.core.arithmetricexpression.\u eval(arithmetricexpression.java:51)
位于freemarker.core.Expression.eval(Expression.java:81)
在freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:96)中
在freemarker.core.DollarVariable.accept(DollarVariable.java:59)中
访问(Environment.java:326)
访问(Environment.java:368)
在freemarker.core.IteratorBlock$IterationContext.ExecutedNestedContentForColorSeqListing(IteratorBlock.java:315)中
在freemarker.core.IteratorBlock$IterationContext.ExecuteTestedContent(IteratorBlock.java:271)中
在freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:242)中
位于freemarker.core.Environment.visitIteratorBlock(Environment.java:595)
位于freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:107)
位于freemarker.core.IteratorBlock.accept(IteratorBlock.java:93)
访问(Environment.java:326)
访问(Environment.java:332)
位于freemarker.core.Environment.process(Environment.java:305)
位于freemarker.template.template.process(template.java:378)
在com.imoveinvest.propertyuploader.PDFGenerationDemo.makeTemplate(PDFGenerationDemo.java:57)上
在com.imoveinvest.propertyuploader.PDFGenerationDemo.makeHTML(PDFGenerationDemo.java:46)
在com.imoveinvest.propertyuploader.controller.saveorValidateEvaluationReport.htmlCall(saveorValidateEvaluationReport.java:152)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
位于org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
位于org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
位于org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
位于org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
位于org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
位于org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
位于org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
位于org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
位于org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
位于org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
位于org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
位于org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
位于org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
在org.apache上。
freemarker.core._TemplateModelException: An error has occurred when reading existing sub-variable "capital"; see cause exception! The type of the containing value was: extended_hash+string (org.json.JSONObject wrapped into f.e.b.StringModel)
----
FTL stack trace ("~" means nesting-related):
- Failed at: ${item.capital - value} [in template "sampleTemplate.ftl" at line 8, column 38]
----
at freemarker.ext.beans.BeanModel.get(BeanModel.java:186)
at freemarker.core.Dot._eval(Dot.java:43)
at freemarker.core.Expression.eval(Expression.java:81)
at freemarker.core.Expression.evalToNumber(Expression.java:118)
at freemarker.core.ArithmeticExpression._eval(ArithmeticExpression.java:51)
at freemarker.core.Expression.eval(Expression.java:81)
at freemarker.core.DollarVariable.calculateInterpolatedStringOrMarkup(DollarVariable.java:96)
at freemarker.core.DollarVariable.accept(DollarVariable.java:59)
at freemarker.core.Environment.visit(Environment.java:326)
at freemarker.core.Environment.visit(Environment.java:368)
at freemarker.core.IteratorBlock$IterationContext.executedNestedContentForCollOrSeqListing(IteratorBlock.java:315)
at freemarker.core.IteratorBlock$IterationContext.executeNestedContent(IteratorBlock.java:271)
at freemarker.core.IteratorBlock$IterationContext.accept(IteratorBlock.java:242)
at freemarker.core.Environment.visitIteratorBlock(Environment.java:595)
at freemarker.core.IteratorBlock.acceptWithResult(IteratorBlock.java:107)
at freemarker.core.IteratorBlock.accept(IteratorBlock.java:93)
at freemarker.core.Environment.visit(Environment.java:326)
at freemarker.core.Environment.visit(Environment.java:332)
at freemarker.core.Environment.process(Environment.java:305)
at freemarker.template.Template.process(Template.java:378)
at com.imoveinvest.propertyuploader.PDFGenerationDemo.makeTemplate(PDFGenerationDemo.java:57)
at com.imoveinvest.propertyuploader.PDFGenerationDemo.makeHTML(PDFGenerationDemo.java:46)
at com.imoveinvest.propertyuploader.controller.SaveOrValidateValuationReport.htmlCall(SaveOrValidateValuationReport.java:152)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at freemarker.ext.beans.BeansWrapper.invokeMethod(BeansWrapper.java:1487)
at freemarker.ext.beans.BeanModel.invokeGenericGet(BeanModel.java:268)
at freemarker.ext.beans.BeanModel.get(BeanModel.java:155)
... 64 common frames omitted
Caused by: org.json.JSONException: JSONObject["capital"] not found.
at org.json.JSONObject.get(JSONObject.java:473)
... 71 common frames omitted
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1>Deserialization with Freemarker Hash</h1>
<div>FreeMarker template error (DEBUG mode; use RETHROW in production!):