File: kotlin.md

package info (click to toggle)
java-template-engine 3.2.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,080 kB
  • sloc: java: 20,560; xml: 1,619; sh: 49; jsp: 47; makefile: 2
file content (96 lines) | stat: -rw-r--r-- 2,654 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
---
title: jte Kotlin tips
description: Details specific to Kotlin usage
---

# Kotlin Details

Kotlin entails a few differences. The `jte-kotlin` dependency is needed to enable `.kte` templates that contain 
Kotlin code. Keep in mind that Kotlin application code can use either Java (`.jte`) or Kotlin (`.kte`) templates. `.kte` 
files are only needed for Kotlin based templates. 

## Add required dependencies

This dependency is a compile time dependency to avoid including the Kotlin compiler in the resulting build.

=== "Maven"

    ```xml linenums="1"
    <dependency>
        <groupId>gg.jte</groupId>
        <artifactId>jte-kotlin</artifactId>
        <version>{{ latest-git-tag }}</version>
        <scope>compile</scope>
    </dependency>
    ```

=== "Gradle"

    ```groovy linenums="1"
    compileOnly "gg.jte:jte-kotlin:{{ latest-git-tag }}"
    ```

## Common errors

### Non-null parameters

=== "Non-null (`.kte file`)"

    ```html linenums="1"
    @param name: String
    ```

=== "Nullable (`.kte file`)"

    ```html linenums="1"
    @param name: String?
    ```

If a non-null parameter exists in the template, the template will fail to load with an error in the line where the 
parameter is being included. 

```
Error rendering template:

Failed to render admin/index.kte, error at admin/index.kte:1
(many many lines of stack trace)
Caused by: java.lang.NullPointerException: null cannot be cast to non-null type kotlin.String
```
### Writing a non-supported type to a template

```html linenums="1"
@param myList: List

${myList}
```

This will generate an error like so:

```
gg.jte.TemplateException: Failed to compile template, error at myPage/index.kte:3
			jteOutput.writeUserContent(things)
/Users/aUser/app/jte-classes/gg/jte/generated/ondemand/index/JteindexGenerated.kt:13:14
Reason: None of the following functions can be called with the arguments supplied: 
public open fun writeUserContent(p0: Content!): Unit defined in gg.jte.html.HtmlTemplateOutput
public open fun writeUserContent(p0: Boolean): Unit defined in gg.jte.html.HtmlTemplateOutput
(etc.)
```

This will be improved in the future.

### Nulls in `@for` expressions

`@for` loops use an iterator. If a variable is null then the following error will appear:

```
Failed to compile template, error at myApp/index.kte:5
		for (s in things) {
/Users/aUser/code/cds/jte-classes/gg/jte/generated/ondemand/index/JteindexGenerated.kt:10:13
Reason: Not nullable value required to call an 'iterator()' method on for-loop range
```

A quick fix is to make the parameter have an empty list by default.

```html linenums="1"
@for(things in (things ?: listOf())) 
```