casid / jte

Secure and speedy templates for Java and Kotlin.
https://jte.gg
Apache License 2.0
748 stars 56 forks source link

not work in Spring-Boot #261

Closed shinestmt closed 1 year ago

shinestmt commented 1 year ago

without Physical File

class MemoryCodeResolver implements CodeResolver { 
    // memoryCodeResolver.put(name, sqlTemplate)
    // memoryCodeResolver.get(name)
}

All in memory

String sql = """
            SELECT id,name,age,grade FROM demo_user 
            where age = ${user.getAge()}
            @if(user.getGrade() != null)
              grade = ${user.getGrade()}
            @endif
            """
engine = TemplateEngine.create(memoryCodeResolver, ContentType.Plain)
memoryCodeResolver.put("selectList", sql)

StringOutput output = new StringOutput()
engine.render("selectList", parameters, output)

using Spring-Boot [ IDEA debugging ] --> OK

but

# spring boot project
mvn package 

java -jar target/demo.jar

# error

Does it support Memory Compile? like this:

String javaSource = "public class .........."    // generated java code
Class clazz = compiler.compile("selectList", javaSource)   // compile to Class, not xxx.class File
clazz.newInstance()

https://github.com/raulgomis/dynamic-java-compiler/tree/master

casid commented 1 year ago

Hey, Spring Boot uses its own classloader, so you need to add the classloader to the call where you create the template engine.

TemplateEngine templateEngine = TemplateEngine.create(codeResolver, Paths.get("jte-classes"), ContentType.Html, getClass().getClassLoader());

Also, please, for your own sanity and for the security of your database, don't use a template engine to generate SQL queries.