Skip to content

Commit 7bb500d

Browse files
committed
write @ResponseStatus annotation (#339)
1 parent 9c148fd commit 7bb500d

File tree

12 files changed

+147
-2
lines changed

12 files changed

+147
-2
lines changed

src/main/kotlin/io/openapiprocessor/spring/processor/SpringFrameworkAnnotations.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package io.openapiprocessor.spring.processor
88
import io.openapiprocessor.core.converter.mapping.SimpleParameterValue
99
import io.openapiprocessor.core.framework.FrameworkAnnotations
1010
import io.openapiprocessor.core.model.Annotation
11+
import io.openapiprocessor.core.model.EndpointResponseStatus
1112
import io.openapiprocessor.core.model.RequestBody
1213
import io.openapiprocessor.core.model.parameters.CookieParameter
1314
import io.openapiprocessor.core.model.parameters.HeaderParameter
@@ -44,6 +45,10 @@ class SpringFrameworkAnnotations: FrameworkAnnotations {
4445
}
4546
}
4647

48+
override fun getAnnotation(status: EndpointResponseStatus): Annotation {
49+
return RESPONSE_STATUS_ANNOTATION
50+
}
51+
4752
private fun getAnnotation(key: String): Annotation {
4853
return PARAMETER_ANNOTATIONS.getValue(key)
4954
}
@@ -90,6 +95,12 @@ private val PARAMETER_ANNOTATIONS = hashMapOf(
9095
"body" to Annotation (getAnnotationName("RequestBody"))
9196
)
9297

98+
private val RESPONSE_STATUS_ANNOTATION = Annotation (
99+
getAnnotationName("ResponseStatus"),
100+
linkedMapOf("code" to SimpleParameterValue(
101+
"HttpStatus", "org.springframework.http.HttpStatus"
102+
)))
103+
93104
private val UNKNOWN_ANNOTATION = Annotation("Unknown")
94105

95106
private const val ANNOTATION_PKG = "org.springframework.web.bind.annotation"

src/main/kotlin/io/openapiprocessor/spring/processor/SpringProcessor.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import io.openapiprocessor.spring.Version
1515
import io.openapiprocessor.spring.writer.java.*
1616
import io.openapiprocessor.spring.writer.java.MappingAnnotationWriter
1717
import io.openapiprocessor.spring.writer.java.ParameterAnnotationWriter
18+
import io.openapiprocessor.spring.writer.java.StatusAnnotationWriter
1819
import io.openapiprocessor.test.api.OpenApiProcessorTest
1920
import org.slf4j.Logger
2021
import org.slf4j.LoggerFactory
@@ -64,6 +65,7 @@ class SpringProcessor : OpenApiProcessorTest {
6465
MethodWriter(
6566
options,
6667
identifier,
68+
StatusAnnotationWriter(annotations),
6769
MappingAnnotationWriter(annotations),
6870
ParameterAnnotationWriter(annotations),
6971
beanValidations,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright 2025 https://github.com/openapi-processor/openapi-processor-spring
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.spring.writer.java
7+
8+
import io.openapiprocessor.core.framework.FrameworkAnnotations
9+
import io.openapiprocessor.core.model.Endpoint
10+
import io.openapiprocessor.core.model.EndpointResponse
11+
import io.openapiprocessor.core.model.EndpointResponseStatus
12+
import java.io.Writer
13+
import io.openapiprocessor.core.writer.java.StatusAnnotationWriter as CoreStatusAnnotationWriter
14+
15+
class StatusAnnotationWriter(private val annotations: FrameworkAnnotations): CoreStatusAnnotationWriter {
16+
17+
override fun write(
18+
target: Writer,
19+
endpoint: Endpoint,
20+
endpointResponse: EndpointResponse
21+
) {
22+
target.write(createStatusAnnotation(endpointResponse))
23+
}
24+
25+
private fun createStatusAnnotation(status: EndpointResponseStatus): String {
26+
val data = annotations.getAnnotation(status)
27+
val statusCode = status.statusCode.toInt()
28+
29+
var annotation = data.annotationName
30+
annotation += "("
31+
annotation += "HttpStatus.valueOf($statusCode)"
32+
annotation += ")"
33+
return annotation
34+
}
35+
}

src/test/groovy/io/openapiprocessor/spring/writer/java/MethodWriterSpec.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class MethodWriterSpec extends Specification {
3939
def writer = new MethodWriter (
4040
apiOptions,
4141
identifier,
42+
new StatusAnnotationWriter(new SpringFrameworkAnnotations()),
4243
new MappingAnnotationWriter(new SpringFrameworkAnnotations()),
4344
new ParameterAnnotationWriter(new SpringFrameworkAnnotations()),
4445
new BeanValidationFactory (apiOptions),
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2025 https://github.com/openapi-processor/openapi-processor-spring
3+
* PDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.openapiprocessor.spring.writer.java
7+
8+
import io.kotest.core.spec.style.StringSpec
9+
import io.kotest.matchers.equals.shouldBeEqual
10+
import io.openapiprocessor.core.model.Endpoint
11+
import io.openapiprocessor.core.model.Response
12+
import io.openapiprocessor.core.model.datatypes.NoneDataType
13+
import io.openapiprocessor.core.parser.HttpMethod
14+
import io.openapiprocessor.spring.processor.SpringFrameworkAnnotations
15+
import java.io.StringWriter
16+
17+
18+
class StatusAnnotationWriterSpec: StringSpec({
19+
val writer = StatusAnnotationWriter(SpringFrameworkAnnotations())
20+
val target = StringWriter()
21+
22+
"write response status annotation" {
23+
val ep = Endpoint(
24+
"/foo",
25+
HttpMethod.GET,
26+
emptyList(),
27+
emptyList(),
28+
mapOf(
29+
"204" to listOf(Response("?", NoneDataType()))
30+
)
31+
)
32+
33+
writer.write(target, ep, ep.endpointResponses.first())
34+
35+
target.toString() shouldBeEqual """@ResponseStatus(HttpStatus.valueOf(204))"""
36+
}
37+
})

src/testInt/kotlin/io/openapiprocessor/spring/ProcessorTestSets.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.openapiprocessor.spring
77

88
import io.openapiprocessor.test.*
9+
import io.openapiprocessor.test.test30_D_
910

1011
data class TestSet(val name: String, val openapi: String)
1112

@@ -18,7 +19,8 @@ val ALL_30: List<TestParams> = listOf(
1819
test30_D_("params-query-annotate-simple-mapping"),
1920
test30_DR("params-request-body"),
2021
test30_D_("params-request-body-multipart-mapping"),
21-
test30_D_("params-simple-data-types")
22+
test30_D_("params-simple-data-types"),
23+
test30_D_("response-status")
2224
)
2325

2426
val ALL_31: List<TestParams> = listOf(
@@ -30,5 +32,6 @@ val ALL_31: List<TestParams> = listOf(
3032
test31_D_("params-query-annotate-simple-mapping"),
3133
test31_DR("params-request-body"),
3234
test31_DR("params-request-body-multipart-mapping"),
33-
test31_D_("params-simple-data-types")
35+
test31_D_("params-simple-data-types"),
36+
test31_D_("response-status")
3437
)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
prefix: api
2+
items:
3+
- inputs/openapi30.yaml
4+
- inputs/openapi31.yaml
5+
- inputs/mapping.yaml
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
openapi-processor-mapping: v13
2+
3+
options:
4+
package-name: generated
5+
format-code: false
6+
7+
map:
8+
result-style: success
9+
result-status: true
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
openapi: 3.0.2
2+
info:
3+
title: response status
4+
version: 1.0.0
5+
6+
paths:
7+
8+
/foo:
9+
get:
10+
responses:
11+
'204':
12+
description: empty
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
openapi: 3.1.0
2+
info:
3+
title: response status
4+
version: 1.0.0
5+
6+
paths:
7+
8+
/foo:
9+
get:
10+
responses:
11+
'204':
12+
description: empty
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
prefix: generated
2+
items:
3+
- outputs/api/Api.java
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package generated.api;
2+
3+
import generated.support.Generated;
4+
import org.springframework.http.HttpStatus;
5+
import org.springframework.web.bind.annotation.GetMapping;
6+
import org.springframework.web.bind.annotation.ResponseStatus;
7+
8+
@Generated(value = "openapi-processor-spring", version = "test")
9+
public interface Api {
10+
11+
@ResponseStatus(HttpStatus.valueOf(204))
12+
@GetMapping(path = "/foo")
13+
void getFoo();
14+
15+
}

0 commit comments

Comments
 (0)