33import io .dinject .controller .Delete ;
44import io .dinject .controller .Form ;
55import io .dinject .controller .Get ;
6+ import io .dinject .controller .MediaType ;
67import io .dinject .controller .Patch ;
78import io .dinject .controller .Post ;
9+ import io .dinject .controller .Produces ;
810import io .dinject .controller .Put ;
911import io .dinject .javalin .generator .javadoc .Javadoc ;
1012import io .swagger .v3 .oas .annotations .Hidden ;
@@ -45,6 +47,8 @@ class MethodReader {
4547 */
4648 private final List <String > methodRoles ;
4749
50+ private final String produces ;
51+
4852 private String fullPath ;
4953
5054 private PathSegments segments ;
@@ -57,10 +61,16 @@ class MethodReader {
5761 this .isVoid = element .getReturnType ().toString ().equals ("void" );
5862 this .methodRoles = Util .findRoles (element );
5963 this .javadoc = Javadoc .parse (ctx .getDocComment (element ));
64+ this .produces = produces (element , bean );
6065
6166 readMethodAnnotation ();
6267 }
6368
69+ private String produces (ExecutableElement element , ControllerReader bean ) {
70+ final Produces produces = element .getAnnotation (Produces .class );
71+ return (produces != null ) ? produces .value () : bean .getProduces ();
72+ }
73+
6474 void read () {
6575 if (!methodRoles .isEmpty ()) {
6676 bean .addStaticImportType (JAVALIN_ROLES );
@@ -129,7 +139,8 @@ void addMeta(ProcessingContext ctx) {
129139 responses .addApiResponse ("204" , response );
130140 } else {
131141 responses .addApiResponse (ApiResponses .DEFAULT , response );
132- response .setContent (ctx .createContent (returnType , "application/json" ));
142+ String contentMediaType = (produces == null ) ? MediaType .APPLICATION_JSON : produces ;
143+ response .setContent (ctx .createContent (returnType , contentMediaType ));
133144 }
134145 }
135146 }
@@ -169,8 +180,8 @@ void addRoute(Append writer) {
169180 }
170181 writer .append (" " );
171182
172- if (isReturnJson ()) {
173- writer . append ( "ctx.json(" );
183+ if (isReturnContent ()) {
184+ writeContextReturn ( writer );
174185 }
175186 writer .append ("controller." );
176187 writer .append (element .getSimpleName ().toString ()).append ("(" );
@@ -181,7 +192,7 @@ void addRoute(Append writer) {
181192 params .get (i ).buildParamName (writer );
182193 }
183194 writer .append (")" );
184- if (isReturnJson ()) {
195+ if (isReturnContent ()) {
185196 writer .append (")" );
186197 }
187198 writer .append (";" ).eol ();
@@ -203,6 +214,18 @@ void addRoute(Append writer) {
203214 }
204215 }
205216
217+ private void writeContextReturn (Append writer ) {
218+ if (produces == null || produces .equalsIgnoreCase (MediaType .APPLICATION_JSON )) {
219+ writer .append ("ctx.json(" );
220+ } else if (produces .equalsIgnoreCase (MediaType .TEXT_HTML )) {
221+ writer .append ("ctx.html(" );
222+ } else if (produces .equalsIgnoreCase (MediaType .TEXT_PLAIN )) {
223+ writer .append ("ctx.contentType(\" text/plain\" ).result(" );
224+ } else {
225+ writer .append ("ctx.contentType(\" %s\" ).result(" , produces );
226+ }
227+ }
228+
206229 private List <String > roles () {
207230 return methodRoles .isEmpty () ? bean .getRoles () : methodRoles ;
208231 }
@@ -211,12 +234,10 @@ private int httpStatusCode() {
211234 return webMethod .statusCode ();
212235 }
213236
214- private boolean isReturnJson () {
215- // TODO: ... returning non-object types?
237+ private boolean isReturnContent () {
216238 return !isVoid ;
217239 }
218240
219-
220241 private boolean readMethodAnnotation () {
221242
222243 Form form = element .getAnnotation (Form .class );
0 commit comments