diff --git a/build.gradle.kts b/build.gradle.kts index 920ddd5..58ec1f5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -89,6 +89,10 @@ val build by tasks.named("build") { dependsOn(securityTest, dataRestTest, txTest, awsTest) } +kotlin { + explicitApi() +} + java { withSourcesJar() } diff --git a/src/main/kotlin/com/ekino/oss/errors/DefaultErrorCode.kt b/src/main/kotlin/com/ekino/oss/errors/DefaultErrorCode.kt index c024d99..0f3f5f3 100644 --- a/src/main/kotlin/com/ekino/oss/errors/DefaultErrorCode.kt +++ b/src/main/kotlin/com/ekino/oss/errors/DefaultErrorCode.kt @@ -1,12 +1,12 @@ package com.ekino.oss.errors -enum class DefaultErrorCode( +internal enum class DefaultErrorCode( private val value: String ) { NOT_FOUND("error.not_found"), CONFLICT("error.conflict"); - fun value(): String { + internal fun value(): String { return this.value } } diff --git a/src/main/kotlin/com/ekino/oss/errors/ErrorBody.kt b/src/main/kotlin/com/ekino/oss/errors/ErrorBody.kt index bbe5c7e..e0f2f17 100644 --- a/src/main/kotlin/com/ekino/oss/errors/ErrorBody.kt +++ b/src/main/kotlin/com/ekino/oss/errors/ErrorBody.kt @@ -2,7 +2,7 @@ package com.ekino.oss.errors import java.time.Instant -data class ErrorBody( +public data class ErrorBody( val status: Int, val code: String, val message: String, diff --git a/src/main/kotlin/com/ekino/oss/errors/ErrorsAutoConfiguration.kt b/src/main/kotlin/com/ekino/oss/errors/ErrorsAutoConfiguration.kt index 13dbf04..01f11f9 100644 --- a/src/main/kotlin/com/ekino/oss/errors/ErrorsAutoConfiguration.kt +++ b/src/main/kotlin/com/ekino/oss/errors/ErrorsAutoConfiguration.kt @@ -23,60 +23,60 @@ import org.springframework.context.annotation.Configuration @ConditionalOnWebApplication(type = SERVLET) @AutoConfigureBefore(ErrorMvcAutoConfiguration::class) @EnableConfigurationProperties(ErrorsProperties::class) -class ErrorsAutoConfiguration( +public class ErrorsAutoConfiguration( @param:Value("\${spring.application.name}") private val applicationName: String, private val properties: ErrorsProperties ) { @Bean - fun coreExceptionHandler(): CoreExceptionHandler { + public fun coreExceptionHandler(): CoreExceptionHandler { return object : CoreExceptionHandler(applicationName, properties) {} } @Configuration(proxyBeanMethods = false) @ConditionalOnClass(name = ["org.springframework.security.authentication.AuthenticationManager"]) - class SecurityHandlerConfiguration( + public class SecurityHandlerConfiguration( @param:Value("\${spring.application.name}") private val applicationName: String, private val properties: ErrorsProperties ) { @Bean - fun securityExceptionHandler(): SecurityExceptionHandler { + public fun securityExceptionHandler(): SecurityExceptionHandler { return object : SecurityExceptionHandler(applicationName, properties) {} } } @Configuration(proxyBeanMethods = false) @ConditionalOnClass(name = ["org.springframework.data.rest.core.config.RepositoryRestConfiguration"]) - class DataRestHandlerConfiguration( + public class DataRestHandlerConfiguration( @param:Value("\${spring.application.name}") private val applicationName: String, private val properties: ErrorsProperties ) { @Bean - fun dataRestExceptionHandler(): DataRestExceptionHandler { + public fun dataRestExceptionHandler(): DataRestExceptionHandler { return object : DataRestExceptionHandler(applicationName, properties) {} } } @Configuration(proxyBeanMethods = false) @ConditionalOnClass(name = ["org.springframework.dao.DataIntegrityViolationException"]) - class TxHandlerConfiguration( + public class TxHandlerConfiguration( @param:Value("\${spring.application.name}") private val applicationName: String, private val properties: ErrorsProperties ) { @Bean - fun txExceptionHandler(): TxExceptionHandler { + public fun txExceptionHandler(): TxExceptionHandler { return object : TxExceptionHandler(applicationName, properties) {} } } @Configuration(proxyBeanMethods = false) @ConditionalOnClass(name = ["software.amazon.awssdk.services.s3.model.NoSuchKeyException"]) - class AwsHandlerConfiguration( + public class AwsHandlerConfiguration( @param:Value("\${spring.application.name}") private val applicationName: String, private val properties: ErrorsProperties ) { @Bean - fun awsExceptionHandler(): AwsExceptionHandler { + public fun awsExceptionHandler(): AwsExceptionHandler { return object : AwsExceptionHandler(applicationName, properties) {} } } diff --git a/src/main/kotlin/com/ekino/oss/errors/ValidationErrorBody.kt b/src/main/kotlin/com/ekino/oss/errors/ValidationErrorBody.kt index bc07f84..cb83c18 100644 --- a/src/main/kotlin/com/ekino/oss/errors/ValidationErrorBody.kt +++ b/src/main/kotlin/com/ekino/oss/errors/ValidationErrorBody.kt @@ -1,6 +1,6 @@ package com.ekino.oss.errors -data class ValidationErrorBody( +public data class ValidationErrorBody( val code: String, val field: String? = null, val message: String? = null diff --git a/src/main/kotlin/com/ekino/oss/errors/generator/ErrorBodyGenerator.kt b/src/main/kotlin/com/ekino/oss/errors/generator/ErrorBodyGenerator.kt index 8b7d692..da23ca6 100644 --- a/src/main/kotlin/com/ekino/oss/errors/generator/ErrorBodyGenerator.kt +++ b/src/main/kotlin/com/ekino/oss/errors/generator/ErrorBodyGenerator.kt @@ -6,28 +6,28 @@ import com.ekino.oss.errors.ValidationErrorBody import org.springframework.http.HttpStatus import java.time.Instant -fun notFound(service: String, devMessage: String?, stacktrace: String): ErrorBody { +internal fun notFound(service: String, devMessage: String?, stacktrace: String): ErrorBody { return toError(service, HttpStatus.NOT_FOUND, DefaultErrorCode.NOT_FOUND.value(), HttpStatus.NOT_FOUND.reasonPhrase, devMessage, stacktrace, emptyList(), emptyList()) } -fun unavailable(service: String, code: String, devMessage: String?, stacktrace: String): ErrorBody { +internal fun unavailable(service: String, code: String, devMessage: String?, stacktrace: String): ErrorBody { return toError( service, HttpStatus.SERVICE_UNAVAILABLE, code, HttpStatus.SERVICE_UNAVAILABLE.reasonPhrase, devMessage, stacktrace, emptyList(), emptyList() ) } -fun unAuthorized(service: String, code: String, devMessage: String?, stacktrace: String): ErrorBody { +internal fun unAuthorized(service: String, code: String, devMessage: String?, stacktrace: String): ErrorBody { return toError(service, HttpStatus.UNAUTHORIZED, code, HttpStatus.UNAUTHORIZED.reasonPhrase, devMessage, stacktrace, emptyList(), emptyList()) } -fun forbidden(service: String, code: String, devMessage: String?, stacktrace: String): ErrorBody { +internal fun forbidden(service: String, code: String, devMessage: String?, stacktrace: String): ErrorBody { return toError(service, HttpStatus.FORBIDDEN, code, HttpStatus.FORBIDDEN.reasonPhrase, devMessage, stacktrace, emptyList(), emptyList()) } @JvmOverloads -fun badRequest( +internal fun badRequest( service: String, code: String, devMessage: String?, @@ -38,18 +38,18 @@ fun badRequest( return toError(service, HttpStatus.BAD_REQUEST, code, HttpStatus.BAD_REQUEST.reasonPhrase, devMessage, stacktrace, errors, globalErrors) } -fun methodNotAllowed(service: String, code: String, devMessage: String?, stacktrace: String): ErrorBody { +internal fun methodNotAllowed(service: String, code: String, devMessage: String?, stacktrace: String): ErrorBody { return toError( service, HttpStatus.METHOD_NOT_ALLOWED, code, HttpStatus.METHOD_NOT_ALLOWED.reasonPhrase, devMessage, stacktrace, emptyList(), emptyList() ) } -fun conflict(service: String, devMessage: String?, stacktrace: String): ErrorBody { +internal fun conflict(service: String, devMessage: String?, stacktrace: String): ErrorBody { return toError(service, HttpStatus.CONFLICT, DefaultErrorCode.CONFLICT.value(), HttpStatus.CONFLICT.reasonPhrase, devMessage, stacktrace, emptyList(), emptyList()) } -fun preconditionFailed(service: String, devMessage: String, stacktrace: String): ErrorBody { +internal fun preconditionFailed(service: String, devMessage: String, stacktrace: String): ErrorBody { return toError( service, HttpStatus.PRECONDITION_FAILED, @@ -61,20 +61,26 @@ fun preconditionFailed(service: String, devMessage: String, stacktrace: String): emptyList()) } -fun conflict(service: String, devMessage: String, stacktrace: String, errors: List): ErrorBody { +internal fun conflict(service: String, devMessage: String, stacktrace: String, errors: List): ErrorBody { return toError( service, HttpStatus.CONFLICT, DefaultErrorCode.CONFLICT.value(), HttpStatus.CONFLICT.reasonPhrase, devMessage, stacktrace, errors, emptyList() ) } -fun unprocessableEntity(service: String, code: String, devMessage: String, stacktrace: String, errors: List): ErrorBody { +internal fun unprocessableEntity( + service: String, + code: String, + devMessage: String, + stacktrace: String, + errors: List +): ErrorBody { return toError( service, HttpStatus.UNPROCESSABLE_ENTITY, code, HttpStatus.UNPROCESSABLE_ENTITY.reasonPhrase, devMessage, stacktrace, errors, emptyList() ) } @JvmOverloads -fun defaultError( +internal fun defaultError( service: String, httpStatus: HttpStatus, code: String, diff --git a/src/main/kotlin/com/ekino/oss/errors/handler/AwsExceptionHandler.kt b/src/main/kotlin/com/ekino/oss/errors/handler/AwsExceptionHandler.kt index 6179872..1b44ef7 100644 --- a/src/main/kotlin/com/ekino/oss/errors/handler/AwsExceptionHandler.kt +++ b/src/main/kotlin/com/ekino/oss/errors/handler/AwsExceptionHandler.kt @@ -16,14 +16,14 @@ import javax.servlet.http.HttpServletRequest */ @RestControllerAdvice @Order(Ordered.HIGHEST_PRECEDENCE) -abstract class AwsExceptionHandler( +public abstract class AwsExceptionHandler( private val applicationName: String, private val properties: ErrorsProperties ) { private val log by logger() @ExceptionHandler(NoSuchKeyException::class) - fun handleNoSuchKeyException(req: HttpServletRequest, e: NoSuchKeyException): ResponseEntity { + public fun handleNoSuchKeyException(req: HttpServletRequest, e: NoSuchKeyException): ResponseEntity { log.debug("Object not found on S3", e) return notFound(req.toServiceName(applicationName), e.message, e.toStacktrace(properties.displayFullStacktrace)).toErrorResponse() } diff --git a/src/main/kotlin/com/ekino/oss/errors/handler/CoreExceptionHandler.kt b/src/main/kotlin/com/ekino/oss/errors/handler/CoreExceptionHandler.kt index 72868f4..82dc430 100644 --- a/src/main/kotlin/com/ekino/oss/errors/handler/CoreExceptionHandler.kt +++ b/src/main/kotlin/com/ekino/oss/errors/handler/CoreExceptionHandler.kt @@ -34,14 +34,14 @@ import javax.validation.ConstraintViolationException */ @RestControllerAdvice @Order(Ordered.LOWEST_PRECEDENCE) -abstract class CoreExceptionHandler( +public abstract class CoreExceptionHandler( private val applicationName: String, private val properties: ErrorsProperties ) { private val log by logger() @ExceptionHandler(ConnectException::class) - fun handleUnavailableServiceException(req: HttpServletRequest, e: Exception): ResponseEntity { + public fun handleUnavailableServiceException(req: HttpServletRequest, e: Exception): ResponseEntity { log.error("Unavailable service : ", e) return unavailable( req.toServiceName(applicationName), "error.unavailable", e.message, e.toStacktrace(properties.displayFullStacktrace) @@ -49,17 +49,17 @@ abstract class CoreExceptionHandler( } @ExceptionHandler(MethodArgumentNotValidException::class) - fun handleValidationException(req: HttpServletRequest, e: MethodArgumentNotValidException): ResponseEntity { + public fun handleValidationException(req: HttpServletRequest, e: MethodArgumentNotValidException): ResponseEntity { return prepareValidationResponse(req, e, e.bindingResult) } @ExceptionHandler(BindException::class) - fun handleBindException(req: HttpServletRequest, e: BindException): ResponseEntity { + public fun handleBindException(req: HttpServletRequest, e: BindException): ResponseEntity { return prepareValidationResponse(req, e, e.bindingResult) } @ExceptionHandler(NestedRuntimeException::class) - fun handleNestedRuntimeException(req: HttpServletRequest, e: NestedRuntimeException): ResponseEntity { + public fun handleNestedRuntimeException(req: HttpServletRequest, e: NestedRuntimeException): ResponseEntity { log.error("Nested runtime exception : ", e) val cause = e.mostSpecificCause @@ -71,7 +71,7 @@ abstract class CoreExceptionHandler( } @ExceptionHandler(ConstraintViolationException::class) - fun handleConstraintViolationException(req: HttpServletRequest, e: ConstraintViolationException): ResponseEntity { + public fun handleConstraintViolationException(req: HttpServletRequest, e: ConstraintViolationException): ResponseEntity { log.debug("Constraint violation errors : ", e) val errors = e.constraintViolations?.map { it.toValidationErrorBody() } ?: emptyList() @@ -82,7 +82,7 @@ abstract class CoreExceptionHandler( } @ExceptionHandler(HttpMessageConversionException::class) - fun handleMessageNotReadableException(req: HttpServletRequest, e: HttpMessageConversionException): ResponseEntity { + public fun handleMessageNotReadableException(req: HttpServletRequest, e: HttpMessageConversionException): ResponseEntity { log.debug("Message not readable : ", e) return badRequest( req.toServiceName(applicationName), "error.not_readable_json", e.message, e.toStacktrace(properties.displayFullStacktrace) @@ -90,7 +90,7 @@ abstract class CoreExceptionHandler( } @ExceptionHandler(MethodArgumentTypeMismatchException::class) - fun handleArgumentTypeMismatchException(req: HttpServletRequest, e: MethodArgumentTypeMismatchException): ResponseEntity { + public fun handleArgumentTypeMismatchException(req: HttpServletRequest, e: MethodArgumentTypeMismatchException): ResponseEntity { log.debug("Argument type mismatch : ", e) return badRequest( req.toServiceName(applicationName), "error.argument_type_mismatch", e.message, e.toStacktrace(properties.displayFullStacktrace) @@ -98,7 +98,10 @@ abstract class CoreExceptionHandler( } @ExceptionHandler(MissingServletRequestParameterException::class) - fun handleMissingServletRequestParameterException(req: HttpServletRequest, e: MissingServletRequestParameterException): ResponseEntity { + public fun handleMissingServletRequestParameterException( + req: HttpServletRequest, + e: MissingServletRequestParameterException + ): ResponseEntity { log.debug("Missing parameter : ", e) return badRequest( req.toServiceName(applicationName), "error.missing_parameter", e.message, e.toStacktrace(properties.displayFullStacktrace) @@ -106,7 +109,7 @@ abstract class CoreExceptionHandler( } @ExceptionHandler(HttpRequestMethodNotSupportedException::class) - fun handleMethodNotSupportedException(req: HttpServletRequest, e: HttpRequestMethodNotSupportedException): ResponseEntity { + public fun handleMethodNotSupportedException(req: HttpServletRequest, e: HttpRequestMethodNotSupportedException): ResponseEntity { log.debug("Method not supported : ", e) return methodNotAllowed( req.toServiceName(applicationName), "error.method_not_allowed", e.message, e.toStacktrace(properties.displayFullStacktrace) @@ -114,13 +117,13 @@ abstract class CoreExceptionHandler( } @ExceptionHandler(NoHandlerFoundException::class) - fun handleNoHandlerFoundException(req: HttpServletRequest, e: NoHandlerFoundException): ResponseEntity { + public fun handleNoHandlerFoundException(req: HttpServletRequest, e: NoHandlerFoundException): ResponseEntity { log.trace("Resource not found : ", e) return notFound(req.toServiceName(applicationName), e.message, e.toStacktrace(properties.displayFullStacktrace)).toErrorResponse() } @ExceptionHandler(Throwable::class) - fun handleException(req: HttpServletRequest, e: Throwable): ResponseEntity { + public fun handleException(req: HttpServletRequest, e: Throwable): ResponseEntity { val responseStatus = AnnotationUtils.findAnnotation(e.javaClass, ResponseStatus::class.java) if (responseStatus == null) { diff --git a/src/main/kotlin/com/ekino/oss/errors/handler/DataRestExceptionHandler.kt b/src/main/kotlin/com/ekino/oss/errors/handler/DataRestExceptionHandler.kt index 109a40e..6d77a81 100644 --- a/src/main/kotlin/com/ekino/oss/errors/handler/DataRestExceptionHandler.kt +++ b/src/main/kotlin/com/ekino/oss/errors/handler/DataRestExceptionHandler.kt @@ -21,20 +21,20 @@ import javax.servlet.http.HttpServletRequest */ @RestControllerAdvice @Order(Ordered.HIGHEST_PRECEDENCE) -abstract class DataRestExceptionHandler( +public abstract class DataRestExceptionHandler( private val applicationName: String, private val properties: ErrorsProperties ) { private val log by logger() @ExceptionHandler(ResourceNotFoundException::class) - fun handleResourceNotFoundException(req: HttpServletRequest, e: ResourceNotFoundException): ResponseEntity { + public fun handleResourceNotFoundException(req: HttpServletRequest, e: ResourceNotFoundException): ResponseEntity { log.trace("Resource not found : ", e) return notFound(req.toServiceName(applicationName), e.message, e.toStacktrace(properties.displayFullStacktrace)).toErrorResponse() } @ExceptionHandler(RepositoryConstraintViolationException::class) - fun handleRepositoryConstraintViolationException( + public fun handleRepositoryConstraintViolationException( e: RepositoryConstraintViolationException, req: HttpServletRequest ): ResponseEntity { @@ -50,7 +50,7 @@ abstract class DataRestExceptionHandler( } @ExceptionHandler(DataIntegrityViolationException::class) - fun handleConflict(e: DataIntegrityViolationException, req: HttpServletRequest): ResponseEntity { + public fun handleConflict(e: DataIntegrityViolationException, req: HttpServletRequest): ResponseEntity { log.debug("Database conflict : ", e) val cause = e.cause diff --git a/src/main/kotlin/com/ekino/oss/errors/handler/HandlerHelper.kt b/src/main/kotlin/com/ekino/oss/errors/handler/HandlerHelper.kt index f4d14e1..fdccd2b 100644 --- a/src/main/kotlin/com/ekino/oss/errors/handler/HandlerHelper.kt +++ b/src/main/kotlin/com/ekino/oss/errors/handler/HandlerHelper.kt @@ -12,15 +12,15 @@ import org.springframework.validation.ObjectError import javax.servlet.http.HttpServletRequest import javax.validation.ConstraintViolation -const val DEFAULT_INTERNAL_ERROR_MESSAGE = "An internal error occurred on processing request." -const val INVALID_ERROR_PREFIX = "error.invalid" -const val MISSING_ERROR_PREFIX = "error.missing" +internal const val DEFAULT_INTERNAL_ERROR_MESSAGE = "An internal error occurred on processing request." +internal const val INVALID_ERROR_PREFIX = "error.invalid" +internal const val MISSING_ERROR_PREFIX = "error.missing" -fun ErrorBody.toErrorResponse(httpHeaders: HttpHeaders? = null): ResponseEntity { +internal fun ErrorBody.toErrorResponse(httpHeaders: HttpHeaders? = null): ResponseEntity { return ResponseEntity(this, httpHeaders, HttpStatus.valueOf(this.status)) } -fun ObjectError.toValidationErrorBody(): ValidationErrorBody { +internal fun ObjectError.toValidationErrorBody(): ValidationErrorBody { val errorCodePrefix: String = if (this.code == null) { INVALID_ERROR_PREFIX } else { @@ -44,7 +44,7 @@ fun ObjectError.toValidationErrorBody(): ValidationErrorBody { } } -fun ConstraintViolation<*>.toValidationErrorBody(): ValidationErrorBody { +internal fun ConstraintViolation<*>.toValidationErrorBody(): ValidationErrorBody { val fieldName = this.propertyPath?.toString() val errorCode = toErrorCode(INVALID_ERROR_PREFIX, fieldName) @@ -55,7 +55,7 @@ fun ConstraintViolation<*>.toValidationErrorBody(): ValidationErrorBody { ) } -fun toErrorCode(errorPrefix: String, fieldName: String?): String { +internal fun toErrorCode(errorPrefix: String, fieldName: String?): String { val field = if (fieldName.isNullOrBlank()) { "unknown" } else { @@ -65,14 +65,14 @@ fun toErrorCode(errorPrefix: String, fieldName: String?): String { return errorPrefix + field } -fun String.toLowerCamelToSnakeCase(): String = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, this) +internal fun String.toLowerCamelToSnakeCase(): String = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, this) -fun String.toUpperCamelToSnakeCase(): String = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, this) +internal fun String.toUpperCamelToSnakeCase(): String = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, this) -fun Throwable.toStacktrace(displayFullStacktrace: Boolean): String { +internal fun Throwable.toStacktrace(displayFullStacktrace: Boolean): String { return if (displayFullStacktrace) ExceptionUtils.getStackTrace(this) else "" } -fun HttpServletRequest.toServiceName(applicationName: String): String { +internal fun HttpServletRequest.toServiceName(applicationName: String): String { return "$applicationName : ${this.method} ${this.requestURI}" } diff --git a/src/main/kotlin/com/ekino/oss/errors/handler/Logger.kt b/src/main/kotlin/com/ekino/oss/errors/handler/Logger.kt index 01a8497..8fff906 100644 --- a/src/main/kotlin/com/ekino/oss/errors/handler/Logger.kt +++ b/src/main/kotlin/com/ekino/oss/errors/handler/Logger.kt @@ -2,4 +2,4 @@ package com.ekino.oss.errors.handler import org.slf4j.LoggerFactory -fun T.logger() = lazy { LoggerFactory.getLogger(this.javaClass) } +internal fun T.logger() = lazy { LoggerFactory.getLogger(this.javaClass) } diff --git a/src/main/kotlin/com/ekino/oss/errors/handler/SecurityExceptionHandler.kt b/src/main/kotlin/com/ekino/oss/errors/handler/SecurityExceptionHandler.kt index 5c50805..df305e8 100644 --- a/src/main/kotlin/com/ekino/oss/errors/handler/SecurityExceptionHandler.kt +++ b/src/main/kotlin/com/ekino/oss/errors/handler/SecurityExceptionHandler.kt @@ -23,7 +23,7 @@ import javax.servlet.http.HttpServletRequest */ @RestControllerAdvice @Order(Ordered.HIGHEST_PRECEDENCE) -abstract class SecurityExceptionHandler( +public abstract class SecurityExceptionHandler( private val applicationName: String, private val properties: ErrorsProperties ) { @@ -31,7 +31,7 @@ abstract class SecurityExceptionHandler( @ExceptionHandler(AuthenticationCredentialsNotFoundException::class, InsufficientAuthenticationException::class, UsernameNotFoundException::class, BadCredentialsException::class) - fun handleAuthenticationException(req: HttpServletRequest, e: Exception): ResponseEntity { + public fun handleAuthenticationException(req: HttpServletRequest, e: Exception): ResponseEntity { log.debug("Authentication failed : ", e) return unAuthorized( req.toServiceName(applicationName), "error.unauthorized", e.message, e.toStacktrace(properties.displayFullStacktrace) @@ -39,7 +39,7 @@ abstract class SecurityExceptionHandler( } @ExceptionHandler(AccessDeniedException::class) - fun handleAccessDeniedException(req: HttpServletRequest, e: Exception): ResponseEntity { + public fun handleAccessDeniedException(req: HttpServletRequest, e: Exception): ResponseEntity { log.debug("Access denied", e) return forbidden( req.toServiceName(applicationName), "error.access_denied", e.message, e.toStacktrace(properties.displayFullStacktrace) @@ -47,7 +47,7 @@ abstract class SecurityExceptionHandler( } @ExceptionHandler(DisabledException::class) - fun handleDisabledException(req: HttpServletRequest, e: Exception): ResponseEntity { + public fun handleDisabledException(req: HttpServletRequest, e: Exception): ResponseEntity { log.debug("Disable account : ", e) return forbidden( req.toServiceName(applicationName), "error.disabled_account", e.message, e.toStacktrace(properties.displayFullStacktrace) @@ -55,7 +55,7 @@ abstract class SecurityExceptionHandler( } @ExceptionHandler(RequestRejectedException::class) - fun handleFirewallException(req: HttpServletRequest, e: Exception): ResponseEntity { + public fun handleFirewallException(req: HttpServletRequest, e: Exception): ResponseEntity { log.debug("Access denied", e) return forbidden( req.toServiceName(applicationName), "error.request_rejected", e.message, e.toStacktrace(properties.displayFullStacktrace) diff --git a/src/main/kotlin/com/ekino/oss/errors/handler/TxExceptionHandler.kt b/src/main/kotlin/com/ekino/oss/errors/handler/TxExceptionHandler.kt index 6a2c050..e04f23e 100644 --- a/src/main/kotlin/com/ekino/oss/errors/handler/TxExceptionHandler.kt +++ b/src/main/kotlin/com/ekino/oss/errors/handler/TxExceptionHandler.kt @@ -17,14 +17,14 @@ import javax.servlet.http.HttpServletRequest */ @RestControllerAdvice @Order(Ordered.HIGHEST_PRECEDENCE) -abstract class TxExceptionHandler( +public abstract class TxExceptionHandler( private val applicationName: String, private val properties: ErrorsProperties ) { private val log by logger() @ExceptionHandler(DataIntegrityViolationException::class) - fun handleConflict(e: DataIntegrityViolationException, req: HttpServletRequest): ResponseEntity { + public fun handleConflict(e: DataIntegrityViolationException, req: HttpServletRequest): ResponseEntity { log.debug("Database conflict : ", e) val cause = e.cause diff --git a/src/main/kotlin/com/ekino/oss/errors/property/ErrorsProperties.kt b/src/main/kotlin/com/ekino/oss/errors/property/ErrorsProperties.kt index 3b380db..d28019d 100644 --- a/src/main/kotlin/com/ekino/oss/errors/property/ErrorsProperties.kt +++ b/src/main/kotlin/com/ekino/oss/errors/property/ErrorsProperties.kt @@ -3,7 +3,7 @@ package com.ekino.oss.errors.property import org.springframework.boot.context.properties.ConfigurationProperties @ConfigurationProperties("ekino.errors") -class ErrorsProperties { +public class ErrorsProperties { - var displayFullStacktrace: Boolean = false + public var displayFullStacktrace: Boolean = false }