3

htmlunit、junit、および freemarker テンプレートを使用して freemarker 単体テストを実行しようとしています。しかし、 <@spring.message "data"> を使用すると、この例外が発生しました。

freemarker.core.InvalidReferenceException: Expression springMacroRequestContext is undefined on line 89, column 134 in spring.ftl.
at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:125)
at freemarker.core.TemplateObject.invalidTypeException(TemplateObject.java:135)
at freemarker.core.Dot._getAsTemplateModel(Dot.java:78)
at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
at freemarker.core.MethodCall._getAsTemplateModel(MethodCall.java:86)
at freemarker.core.Expression.getAsTemplateModel(Expression.java:89)
at freemarker.core.Expression.getStringValue(Expression.java:93)
at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.IfBlock.accept(IfBlock.java:82)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.Macro$Context.runMacro(Macro.java:172)
at freemarker.core.Environment.visit(Environment.java:614)
at freemarker.core.UnifiedCall.accept(UnifiedCall.java:106)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.Macro$Context.runMacro(Macro.java:172)
at freemarker.core.Environment.visit(Environment.java:614)
at freemarker.core.UnifiedCall.accept(UnifiedCall.java:106)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.MixedContent.accept(MixedContent.java:92)
at freemarker.core.Environment.visit(Environment.java:221)
at freemarker.core.Environment.process(Environment.java:199)
at freemarker.template.Template.process(Template.java:237)

この例外についてのアイデアはありますか?どうすれば修正できますか? 事前に助けてくれてありがとう。

4

3 に答える 3

4

これを自分で理解しようとして約1時間費やしたので、これを処理する適切な方法が何であるかわかりません。しかし、私にとってうまくいったのは、次を使用して「springMacroRequestContext」をデータモデルに手動で追加することです。

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
model.put("springMacroRequestContext", new RequestContext(request, null, null, null));

これは、有効なリクエスト内で発生する必要があることに注意してください。したがって、現在のリクエストがないため、これはおそらく cron ジョブまたはスケジュールされたタスクでは機能しません。

于 2012-08-17T20:00:46.897 に答える
1

Spring controllerContext.xml で Freemarker View Resolver を構成する必要があります。具体的には、次を追加します。

<property name="exposeSpringMacroHelpers" value="true"/>

したがって、次のようになります。

<bean id="freemarkerViewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="cache" value="true"/>
    <property name="prefix" value=""/>
    <property name="suffix" value=".ftl"/>
    <property name="exposeSpringMacroHelpers" value="true"/>
    <property name="exposeSessionAttributes" value="true"/>
    <property name="contentType" value="text/html;charset=UTF-8"/>
</bean>
于 2015-02-19T23:23:58.783 に答える
1

手動で追加することに関するBrad Parksの回答を拡張するspringMacroRequestContext

リクエストをモックできるため、(オブジェクトが WebApplicationContext の Bean である場合WebApplicationContextに簡単にアクセスできる)への参照があれば十分です。@Autowired

// Declare WebApplicationContext as an instance variable
@Autowired
WebApplicationContext ctx;

// Then in the method...:
    // (The mock object is from the org.springframework.mock.web package)
    MockHttpServletRequest req = new MockHttpServletRequest();
    // secret sauce:
    req.setAttribute(RequestContext.WEB_APPLICATION_CONTEXT_ATTRIBUTE, ctx);
    // Create a MacroRequestContext for Freemarker to use
    model.put("springMacroRequestContext", new RequestContext(req));
于 2016-10-13T14:44:11.337 に答える