Skip to content

Commit 77aca50

Browse files
committed
OpenAPI generator now supports Kotlin object controllers.
1 parent df18949 commit 77aca50

5 files changed

Lines changed: 93 additions & 0 deletions

File tree

modules/jooby-openapi/src/main/java/io/jooby/internal/openapi/AnnotationParser.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.objectweb.asm.tree.AbstractInsnNode;
2929
import org.objectweb.asm.tree.AnnotationNode;
3030
import org.objectweb.asm.tree.ClassNode;
31+
import org.objectweb.asm.tree.FieldInsnNode;
3132
import org.objectweb.asm.tree.LdcInsnNode;
3233
import org.objectweb.asm.tree.LocalVariableNode;
3334
import org.objectweb.asm.tree.MethodInsnNode;
@@ -205,6 +206,10 @@ public static List<OperationExt> parse(ParserContext ctx, String prefix,
205206
Type type = Type.getReturnType(methodInsnNode.desc);
206207
return parse(ctx, prefix, type);
207208
}
209+
} else if (previous instanceof FieldInsnNode) {
210+
FieldInsnNode fieldInsnNode = (FieldInsnNode) previous;
211+
Type type = Type.getObjectType(fieldInsnNode.owner);
212+
return parse(ctx, prefix, type);
208213
}
209214
}
210215
return Collections.emptyList();

modules/jooby-openapi/src/test/java/io/jooby/openapi/OpenAPIGeneratorTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import kt.KtCoroutineRouteIdioms;
3030
import kt.KtMvcApp;
3131
import kt.KtMvcAppWithRoutes;
32+
import kt.KtMvcInstanceApp;
33+
import kt.KtMvcObjectApp;
3234
import kt.KtNoAppClassKt;
3335
import kt.KtRouteIdioms;
3436
import kt.KtRouteImport;
@@ -1306,6 +1308,16 @@ public void ktMvc(RouteIterator iterator) {
13061308
assertKtController(iterator);
13071309
}
13081310

1311+
@OpenAPITest(value = KtMvcInstanceApp.class)
1312+
public void ktMvcInstance(RouteIterator iterator) {
1313+
assertKtController(iterator);
1314+
}
1315+
1316+
@OpenAPITest(value = KtMvcObjectApp.class)
1317+
public void ktMvcObject(RouteIterator iterator) {
1318+
assertKtController(iterator);
1319+
}
1320+
13091321
@OpenAPITest(value = KtMvcAppWithRoutes.class)
13101322
public void ktMvcWithRoutes(RouteIterator iterator) {
13111323
assertKtController(iterator);
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package kt
2+
3+
import io.jooby.Kooby
4+
5+
class KtMvcInstanceApp : Kooby({
6+
7+
mvc(KtController())
8+
9+
})
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package kt
2+
3+
import io.jooby.Kooby
4+
5+
class KtMvcObjectApp : Kooby({
6+
7+
mvc(KtObjectController)
8+
9+
})
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package kt
2+
3+
import examples.ABean
4+
import kotlinx.coroutines.delay
5+
import java.util.concurrent.CompletableFuture
6+
import javax.inject.Named
7+
import javax.ws.rs.DELETE
8+
import javax.ws.rs.GET
9+
import javax.ws.rs.HeaderParam
10+
import javax.ws.rs.Path
11+
import javax.ws.rs.QueryParam
12+
13+
object KtObjectController {
14+
15+
@GET
16+
fun doSomething(): String {
17+
return ""
18+
}
19+
20+
@DELETE
21+
@Path("/unit")
22+
fun doUnit() {
23+
}
24+
25+
@GET
26+
@Path("/doMap")
27+
fun doMap(): Map<String, Any> {
28+
return mapOf()
29+
}
30+
31+
@Path("/doParams")
32+
fun params(@QueryParam("I") i: Int,
33+
@QueryParam("oI") oi: Int?,
34+
@QueryParam("q") q: String,
35+
@QueryParam("nullq") nullq: String?): ABean {
36+
return ABean()
37+
}
38+
39+
@GET
40+
@Path("/coroutine")
41+
suspend fun coroutine(): List<String> {
42+
delay(100)
43+
return listOf("...")
44+
}
45+
46+
@GET
47+
@Path("/future")
48+
fun completableFuture(): CompletableFuture<String> {
49+
return CompletableFuture.completedFuture("...")
50+
}
51+
52+
@GET
53+
@Path("/httpNames")
54+
fun httpNames(@HeaderParam("Last-Modified-Since") lastModifiedSince: String,
55+
@Named("x-search") @io.jooby.annotations.QueryParam q: String): String {
56+
return lastModifiedSince
57+
}
58+
}

0 commit comments

Comments
 (0)