ninjaframework / ninja

Ninja is a full stack web framework for Java. Rock solid, fast and super productive.
http://www.ninjaframework.org
Apache License 2.0
1.91k stars 520 forks source link

error during unit test ${lang} #344

Open thibaultmeyer opened 9 years ago

thibaultmeyer commented 9 years ago

Ninja version: 5.1.0 OS: Windows 8.1 64bits

I have a simple tamplate (from the default archetype) and I put this in the index.ftl.html :

<pre>${lang}</pre>

mvn compile and mvn ninja:run works without issue and the HTML page in the browser show the current langage (ie: en, en-US, ...). But during the mvn package process, I got a error on the unit test phase :

FTL stack trace ("~" means nesting-related):
    - Failed at: ${lang} auto-escaped  [in template "views/LandingController/index.ftl.html" at line 2, column 27]

    at freemarker.core.InvalidReferenceException.getInstance(InvalidReferenceException.java:116) ~[freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.EvalUtil.coerceModelToString(EvalUtil.java:346) ~[freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.Expression.evalAndCoerceToString(Expression.java:82) ~[freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.BuiltInForString._eval(BuiltInForString.java:26) ~[freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.Expression.eval(Expression.java:78) ~[freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.Expression.evalAndCoerceToString(Expression.java:82) ~[freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.DollarVariable.accept(DollarVariable.java:40) ~[freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.Environment.visit(Environment.java:312) [freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.MixedContent.accept(MixedContent.java:62) [freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.Environment.visit(Environment.java:312) [freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.EscapeBlock.accept(EscapeBlock.java:48) [freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.Environment.visit(Environment.java:312) [freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.core.Environment.process(Environment.java:290) [freemarker-gae-2.3.22.jar:2.3.22]
    at freemarker.template.Template.process(Template.java:310) [freemarker-gae-2.3.22.jar:2.3.22]
    at ninja.template.TemplateEngineFreemarker.invoke(TemplateEngineFreemarker.java:319) [ninja-core-5.1.0.jar:na]
    at ninja.utils.ResultHandler.renderWithTemplateEngineOrRaw(ResultHandler.java:116) [ninja-core-5.1.0.jar:na]
    at ninja.utils.ResultHandler.handleResult(ResultHandler.java:78) [ninja-core-5.1.0.jar:na]
    at ninja.NinjaDefault.onRouteRequest(NinjaDefault.java:102) [ninja-core-5.1.0.jar:na]
    at ninja.servlet.NinjaServletDispatcher.service(NinjaServletDispatcher.java:86) [ninja-servlet-5.1.0.jar:na]
    at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:279) [guice-servlet-4.0-beta5.jar:na]
    at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:269) [guice-servlet-4.0-beta5.jar:na]
    at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:180) [guice-servlet-4.0-beta5.jar:na]
    at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91) [guice-servlet-4.0-beta5.jar:na]
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:85) [guice-servlet-4.0-beta5.jar:na]
    at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:119) [guice-servlet-4.0-beta5.jar:na]
    at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:133) [guice-servlet-4.0-beta5.jar:na]
    at com.google.inject.servlet.GuiceFilter$1.call(GuiceFilter.java:130) [guice-servlet-4.0-beta5.jar:na]
    at com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:203) [guice-servlet-4.0-beta5.jar:na]
    at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:130) [guice-servlet-4.0-beta5.jar:na]

    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) [jetty-servlet-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:585) [jetty-servlet-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) [jetty-server-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) [jetty-servlet-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) [jetty-server-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.server.Server.handle(Server.java:497) [jetty-server-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) [jetty-server-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) [jetty-server-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) [jetty-io-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) [jetty-util-9.2.10.v20150310.jar:9.2.10.v20150310]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) [jetty-util-9.2.10.v20150310.jar:9.2.10.v20150310]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_40]
ninja.exceptions.RenderingException: The following has evaluated to null or missing:
==> lang  [in template "views/LandingController/index.ftl.html" at line 2, column 29]

----
Tip: If the failing expression is known to be legally refer to something that's null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>.
 (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

I have to use <#if lang??>${lang}</#if> rather than ${lang}, but isn't a good solution (i think) and this is the only predef variable to have this behavior...

raphaelbauer commented 9 years ago

Thanks 0xbaadf00d! does mvn test run?

But usually that's not a bug. It actually can happen that $lang is absent when Ninja is not able to determine the language - neither from the incoming request - nor from the lang cookie set by ninja. Does your test send the accept language header?

If you want to dig in the code have a look into TemplateEngineFreemarker.java line 242

thibaultmeyer commented 9 years ago

Hi,

yes, tests are ran with maven (mvn test or directly mvn package).

If language can't be determined by request or cookie, the translation system use the default value from application.conf ? maybe $lang can be set to this default value too ?