Hi,
the following code, wich uses the FieldValueResolver, leads to an InaccessibleObjectException.
import com.github.jknack.handlebars.Context;
import com.github.jknack.handlebars.Handlebars;
import com.github.jknack.handlebars.context.FieldValueResolver;
import com.github.jknack.handlebars.io.FileTemplateLoader;
public final class Main {
public static void main(final String[] args) throws Throwable {
final var loader = new FileTemplateLoader(".", ".hbs");
final var handlebars = new Handlebars(loader);
final String str = handlebars.compile("foo").apply(
Context.newBuilder(null).resolver(FieldValueResolver.INSTANCE).build());
System.out.println(str);
}
}
Assuming that this code is in the file Main.java and that, sitting next to it, the file foo.hbs contains the following.
And that the file bar.hbs contains the following.
Then the following command produces the exception.
$ java -version
openjdk version "17.0.1" 2021-10-19
OpenJDK Runtime Environment (build 17.0.1+12-Debian-1deb11u2)
OpenJDK 64-Bit Server VM (build 17.0.1+12-Debian-1deb11u2, mixed mode, sharing)
$ java -cp "./handlebars-4.3.0.jar:./slf4j-api-1.7.32.jar" Main.java
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" com.github.jknack.handlebars.HandlebarsException: ./foo.hbs:1:7: java.lang.IllegalStateException: Shouldn't be illegal to access field 'size'
./foo.hbs:1:7
at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:217)
at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:39)
at com.github.jknack.handlebars.context.MemberValueResolver.resolve(MemberValueResolver.java:59)
at com.github.jknack.handlebars.Context$CompositeValueResolver.resolve(Context.java:200)
at com.github.jknack.handlebars.internal.path.PropertyPath.eval(PropertyPath.java:52)
at com.github.jknack.handlebars.Context$PathExpressionChain.next(Context.java:361)
at com.github.jknack.handlebars.Context$PathExpressionChain.eval(Context.java:381)
at com.github.jknack.handlebars.Context.get(Context.java:621)
at com.github.jknack.handlebars.internal.Partial.override(Partial.java:253)
at com.github.jknack.handlebars.internal.Partial.merge(Partial.java:226)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)
at com.github.jknack.handlebars.internal.TemplateList.merge(TemplateList.java:95)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:114)
at com.github.jknack.handlebars.internal.ForwardingTemplate.apply(ForwardingTemplate.java:100)
at Main.main(Main.java:11)
Caused by: java.lang.IllegalStateException: Shouldn't be illegal to access field 'size'
at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:217)
at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:39)
at com.github.jknack.handlebars.context.MemberValueResolver.resolve(MemberValueResolver.java:59)
at com.github.jknack.handlebars.Context$CompositeValueResolver.resolve(Context.java:200)
at com.github.jknack.handlebars.internal.path.PropertyPath.eval(PropertyPath.java:52)
at com.github.jknack.handlebars.Context$PathExpressionChain.next(Context.java:361)
at com.github.jknack.handlebars.Context$PathExpressionChain.eval(Context.java:381)
at com.github.jknack.handlebars.Context.get(Context.java:621)
at com.github.jknack.handlebars.internal.Partial.override(Partial.java:253)
at com.github.jknack.handlebars.internal.Partial.merge(Partial.java:226)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)
at com.github.jknack.handlebars.internal.TemplateList.merge(TemplateList.java:95)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:126)
at com.github.jknack.handlebars.internal.BaseTemplate.apply(BaseTemplate.java:114)
at com.github.jknack.handlebars.internal.ForwardingTemplate.apply(ForwardingTemplate.java:100)
at Main.main(Main.java:11)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:419)
at jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
at jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)
Caused by: java.lang.IllegalAccessException: class com.github.jknack.handlebars.context.FieldValueResolver$FieldMembercannot access a member of class java.util.HashMap (in module java.base) with modifiers "transient"
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:392)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:674)
at java.base/java.lang.reflect.Field.checkAccess(Field.java:1102)
at java.base/java.lang.reflect.Field.get(Field.java:423)
at com.github.jknack.handlebars.context.FieldValueResolver$FieldMember.get(FieldValueResolver.java:135)
at com.github.jknack.handlebars.context.FieldValueResolver.invokeMember(FieldValueResolver.java:214)
... 22 more
Hi,
the following code, wich uses the
FieldValueResolver, leads to anInaccessibleObjectException.Assuming that this code is in the file
Main.javaand that, sitting next to it, the filefoo.hbscontains the following.And that the file
bar.hbscontains the following.Then the following command produces the exception.