[kotlin-spring] fix BigDecimal default value failed to compile (#17956)

This commit is contained in:
Ira Chan
2024-03-08 20:56:16 +08:00
committed by GitHub
parent 34a386c5a3
commit 62d0e3abdb
22 changed files with 605 additions and 2 deletions

View File

@@ -0,0 +1,13 @@
package org.openapitools
import org.springframework.boot.runApplication
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.context.annotation.ComponentScan
@SpringBootApplication
@ComponentScan(basePackages = ["org.openapitools", "org.openapitools.api", "org.openapitools.model"])
class Application
fun main(args: Array<String>) {
runApplication<Application>(*args)
}

View File

@@ -0,0 +1,17 @@
package org.openapitools
import org.springframework.context.annotation.Bean
import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.ResponseBody
import org.springframework.web.bind.annotation.GetMapping
/**
* Home redirection to OpenAPI api documentation
*/
@Controller
class HomeController {
@RequestMapping("/")
fun index(): String = "redirect:swagger-ui.html"
}

View File

@@ -0,0 +1,26 @@
package org.openapitools
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import io.swagger.v3.oas.models.OpenAPI
import io.swagger.v3.oas.models.info.Info
import io.swagger.v3.oas.models.info.Contact
import io.swagger.v3.oas.models.info.License
import io.swagger.v3.oas.models.Components
import io.swagger.v3.oas.models.security.SecurityScheme
@Configuration
class SpringDocConfiguration {
@Bean
fun apiInfo(): OpenAPI {
return OpenAPI()
.info(
Info()
.title("Demo")
.description("No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)")
.version("1.0.0")
)
}
}

View File

@@ -0,0 +1,19 @@
package org.openapitools.api
import org.springframework.web.context.request.NativeWebRequest
import javax.servlet.http.HttpServletResponse
import java.io.IOException
object ApiUtil {
fun setExampleResponse(req: NativeWebRequest, contentType: String, example: String) {
try {
val res = req.getNativeResponse(HttpServletResponse::class.java)
res?.characterEncoding = "UTF-8"
res?.addHeader("Content-Type", contentType)
res?.writer?.print(example)
} catch (e: IOException) {
throw RuntimeException(e)
}
}
}

View File

@@ -0,0 +1,29 @@
package org.openapitools.api
import org.springframework.http.HttpStatus
import org.springframework.web.bind.annotation.ControllerAdvice
import org.springframework.web.bind.annotation.ExceptionHandler
import javax.servlet.http.HttpServletResponse
import javax.validation.ConstraintViolationException
// TODO Extend ApiException for custom exception handling, e.g. the below NotFound exception
sealed class ApiException(msg: String, val code: Int) : Exception(msg)
class NotFoundException(msg: String, code: Int = HttpStatus.NOT_FOUND.value()) : ApiException(msg, code)
@ControllerAdvice
class DefaultExceptionHandler {
@ExceptionHandler(value = [ApiException::class])
fun onApiException(ex: ApiException, response: HttpServletResponse): Unit =
response.sendError(ex.code, ex.message)
@ExceptionHandler(value = [NotImplementedError::class])
fun onNotImplemented(ex: NotImplementedError, response: HttpServletResponse): Unit =
response.sendError(HttpStatus.NOT_IMPLEMENTED.value())
@ExceptionHandler(value = [ConstraintViolationException::class])
fun onConstraintViolation(ex: ConstraintViolationException, response: HttpServletResponse): Unit =
response.sendError(HttpStatus.BAD_REQUEST.value(), ex.constraintViolations.joinToString(", ") { it.message })
}

View File

@@ -0,0 +1,51 @@
package org.openapitools.api
import org.openapitools.model.Apa
import io.swagger.v3.oas.annotations.*
import io.swagger.v3.oas.annotations.enums.*
import io.swagger.v3.oas.annotations.media.*
import io.swagger.v3.oas.annotations.responses.*
import io.swagger.v3.oas.annotations.security.*
import org.springframework.http.HttpStatus
import org.springframework.http.MediaType
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import org.springframework.validation.annotation.Validated
import org.springframework.web.context.request.NativeWebRequest
import org.springframework.beans.factory.annotation.Autowired
import javax.validation.Valid
import javax.validation.constraints.DecimalMax
import javax.validation.constraints.DecimalMin
import javax.validation.constraints.Email
import javax.validation.constraints.Max
import javax.validation.constraints.Min
import javax.validation.constraints.NotNull
import javax.validation.constraints.Pattern
import javax.validation.constraints.Size
import kotlin.collections.List
import kotlin.collections.Map
@RestController
@Validated
@RequestMapping("\${api.base-path:}")
class TestApiController() {
@Operation(
summary = "",
operationId = "testPost",
description = """""",
responses = [
ApiResponse(responseCode = "200", description = "Successful operation") ]
)
@RequestMapping(
method = [RequestMethod.POST],
value = ["/test"],
consumes = ["application/json"]
)
fun testPost(@Parameter(description = "", required = true) @Valid @RequestBody apa: Apa): ResponseEntity<Unit> {
return ResponseEntity(HttpStatus.NOT_IMPLEMENTED)
}
}

View File

@@ -0,0 +1,48 @@
package org.openapitools.model
import java.util.Objects
import com.fasterxml.jackson.annotation.JsonProperty
import javax.validation.constraints.DecimalMax
import javax.validation.constraints.DecimalMin
import javax.validation.constraints.Email
import javax.validation.constraints.Max
import javax.validation.constraints.Min
import javax.validation.constraints.NotNull
import javax.validation.constraints.Pattern
import javax.validation.constraints.Size
import javax.validation.Valid
import io.swagger.v3.oas.annotations.media.Schema
/**
*
* @param bepa
* @param cepa
* @param depa
* @param epa
* @param fepa
* @param gepa
*/
data class Apa(
@Schema(example = "null", required = true, description = "")
@get:JsonProperty("bepa", required = true) val bepa: java.math.BigDecimal = java.math.BigDecimal("0"),
@Schema(example = "null", required = true, description = "")
@get:JsonProperty("cepa", required = true) val cepa: java.math.BigDecimal = java.math.BigDecimal("6.28318"),
@Schema(example = "null", description = "")
@get:JsonProperty("depa") val depa: java.math.BigDecimal? = java.math.BigDecimal("71"),
@Schema(example = "null", description = "")
@get:JsonProperty("epa") val epa: java.math.BigDecimal? = java.math.BigDecimal("-71"),
@Schema(example = "null", description = "")
@Deprecated(message = "")
@get:JsonProperty("fepa") val fepa: java.math.BigDecimal? = java.math.BigDecimal("100"),
@Schema(example = "null", description = "")
@get:JsonProperty("gepa") val gepa: java.math.BigDecimal? = null
) {
}

View File

@@ -0,0 +1,10 @@
spring:
application:
name: demo
jackson:
serialization:
WRITE_DATES_AS_TIMESTAMPS: false
server:
port: 8080

View File

@@ -0,0 +1,55 @@
openapi: 3.0.0
info:
title: Demo
version: 1.0.0
servers:
- url: /
paths:
/test:
post:
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/Apa'
required: true
responses:
"200":
description: Successful operation
components:
schemas:
Apa:
example:
epa: 5.962133916683182
bepa: 0.8008281904610115
depa: 1.4658129805029452
cepa: 6.027456183070403
fepa: 5.637376656633329
gepa: 2.3021358869347655
properties:
bepa:
default: 0
format: long
type: number
cepa:
default: 6.28318
type: number
depa:
default: 71
type: number
epa:
default: -71
nullable: false
type: number
fepa:
default: 100
deprecated: true
nullable: true
type: number
gepa:
nullable: true
type: number
required:
- bepa
- cepa
type: object

View File

@@ -0,0 +1,23 @@
package org.openapitools.api
import org.openapitools.model.Apa
import org.junit.jupiter.api.Test
import org.springframework.http.ResponseEntity
class TestApiTest {
private val api: TestApiController = TestApiController()
/**
* To test TestApiController.testPost
*
* @throws ApiException
* if the Api call fails
*/
@Test
fun testPostTest() {
// val apa: Apa = TODO()
// val response: ResponseEntity<Unit> = api.testPost(apa)
// TODO: test validations
}
}