Skip to content

Commit c139bfe

Browse files
authored
Merge pull request #360 from avaje/feature/355-helidon
#355 Controller methods returning null should produce 204 no content …
2 parents 1d537be + 982b1e4 commit c139bfe

File tree

3 files changed

+45
-8
lines changed

3 files changed

+45
-8
lines changed

http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/nima/ControllerMethodWriter.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -186,19 +186,30 @@ void writeHandler(boolean requestScoped) {
186186
writer.append(");").eol();
187187

188188
if (!method.isVoid() && !isFilter) {
189-
writeContextReturn();
189+
TypeMirror typeMirror = method.returnType();
190+
boolean includeNoContent = !typeMirror.getKind().isPrimitive();
191+
if (includeNoContent) {
192+
writer.append(" if (result == null) {").eol();
193+
writer.append(" res.status(NO_CONTENT_204).send();").eol();
194+
writer.append(" } else {").eol();
195+
}
196+
String indent = includeNoContent ? " " : " ";
197+
writeContextReturn(indent);
190198
if (isInputStream(method.returnType())) {
191199
final var uType = UType.parse(method.returnType());
192-
writer.append(" result.transferTo(res.outputStream());", uType.shortName()).eol();
200+
writer.append(indent).append("result.transferTo(res.outputStream());", uType.shortName()).eol();
193201
} else if (producesJson()) {
194202
if (returnTypeString()) {
195-
writer.append(" res.send(result); // send raw JSON").eol();
203+
writer.append(indent).append("res.send(result); // send raw JSON").eol();
196204
} else {
197205
final var uType = UType.parse(method.returnType());
198-
writer.append(" %sJsonType.toJson(result, JsonOutput.of(res));", uType.shortName()).eol();
206+
writer.append(indent).append("%sJsonType.toJson(result, JsonOutput.of(res));", uType.shortName()).eol();
199207
}
200208
} else {
201-
writer.append(" res.send(result);").eol();
209+
writer.append(indent).append("res.send(result);").eol();
210+
}
211+
if (includeNoContent) {
212+
writer.append(" }").eol();
202213
}
203214
}
204215
writer.append(" }").eol().eol();
@@ -260,14 +271,14 @@ private boolean usesFormParams() {
260271
return method.params().stream().anyMatch(p -> p.isForm() || ParamType.FORMPARAM.equals(p.paramType()));
261272
}
262273

263-
private void writeContextReturn() {
274+
private void writeContextReturn(String indent) {
264275
final var producesOp = Optional.ofNullable(method.produces());
265276
if (producesOp.isEmpty() && !useJsonB) {
266277
return;
267278
}
268-
269279
final var produces = producesOp.map(MediaType::parse).orElse(MediaType.APPLICATION_JSON);
270-
final var contentTypeString = " res.headers().contentType(MediaTypes.";
280+
final var contentTypeString = "res.headers().contentType(MediaTypes.";
281+
writer.append(indent);
271282
switch (produces) {
272283
case APPLICATION_JSON -> writer.append(contentTypeString).append("APPLICATION_JSON);").eol();
273284
case TEXT_HTML -> writer.append(contentTypeString).append("TEXT_HTML);").eol();

tests/test-nima-jsonb/src/main/java/org/example/TestController.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,9 @@ void filter(FilterChain chain, RoutingResponse res) {
140140
String formBean(MyForm form) {
141141
return form.name + "|" + form.email + "|" + form.url;
142142
}
143+
144+
@Get("maybeNoContent")
145+
String maybeNoContent(Boolean empty) {
146+
return Boolean.TRUE.equals(empty) ? null : "Hi";
147+
}
143148
}

tests/test-nima-jsonb/src/test/java/org/example/TestControllerTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,27 @@ void hello() {
2929
assertThat(res.body()).isEqualTo("Hello world - index");
3030
}
3131

32+
@Test
33+
void maybeNoContent() {
34+
HttpResponse<String> res = client.request()
35+
.path("test/maybeNoContent")
36+
.queryParam("empty", false)
37+
.GET()
38+
.asString();
39+
40+
assertThat(res.statusCode()).isEqualTo(200);
41+
assertThat(res.body()).isEqualTo("Hi");
42+
43+
HttpResponse<String> res2 = client.request()
44+
.path("test/maybeNoContent")
45+
.queryParam("empty", true)
46+
.GET()
47+
.asString();
48+
49+
assertThat(res2.statusCode()).isEqualTo(204);
50+
assertThat(res2.body()).isEqualTo("");
51+
}
52+
3253
@Test
3354
void strBody() {
3455
HttpResponse<String> res = client.request()

0 commit comments

Comments
 (0)