From 9dcd27c8d8b6715ca5fee1ce7dad33e79a6beb9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dhji=28=EC=A7=80=EB=8C=80=ED=95=9C=29?= Date: Fri, 22 Jul 2022 07:23:47 +0900 Subject: [PATCH] =?UTF-8?q?=EC=84=A4=EC=A0=95=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20-=20Date=20type=20=EC=9D=BC=EB=B0=98=20?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8=20=ED=8F=AC=EB=A9=A7=ED=8C=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20(YYYY-MM-DD=20HH:mm:ss)=20-=20Swagger=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95(token=20=EA=B8=B0=EC=9E=85)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/palnet/biz/config/DateTimeConfig.java | 68 ++++++++++++++++++ .../com/palnet/biz/config/JsonConfig.java | 14 +++- .../com/palnet/biz/config/SwaggerConfig.java | 71 +++++++++++++++++++ 3 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/palnet/biz/config/DateTimeConfig.java create mode 100644 src/main/java/com/palnet/biz/config/SwaggerConfig.java diff --git a/src/main/java/com/palnet/biz/config/DateTimeConfig.java b/src/main/java/com/palnet/biz/config/DateTimeConfig.java new file mode 100644 index 0000000..dc4ad6a --- /dev/null +++ b/src/main/java/com/palnet/biz/config/DateTimeConfig.java @@ -0,0 +1,68 @@ +package com.palnet.biz.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.format.Formatter; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; +import java.util.Locale; + +@Configuration +public class DateTimeConfig { + + private static final String DATE_FORMAT = "yyyy-MM-dd"; + private static final String TIME_FORMAT = "HH:mm:ss"; + private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss"; + +// @Bean +// public Formatter localDateFormatter() { +// return new Formatter() { +// @Override +// public LocalDate parse(String text, Locale locale) { +// return LocalDate.parse(text, DateTimeFormatter.ofPattern("yyyyMMdd", locale)); +// } +// +// @Override +// public String print(LocalDate object, Locale locale) { +// return DateTimeFormatter.ISO_DATE.format(object); +// } +// }; +// } +// +// +// @Bean +// public Formatter localDateTimeFormatter() { +// return new Formatter() { +// @Override +// public LocalDateTime parse(String text, Locale locale) { +// return LocalDateTime.parse(text, DateTimeFormatter.ofPattern("yyyyMMddHHmmss", locale)); +// } +// +// @Override +// public String print(LocalDateTime object, Locale locale) { +// return DateTimeFormatter.ISO_DATE_TIME.format(object); +// } +// }; +// } + + @Bean + public Formatter DateFormatter() { + return new Formatter() { + @Override + public Date parse(String text, Locale locale) throws ParseException { + SimpleDateFormat dt = new SimpleDateFormat(DATE_TIME_FORMAT, locale); + return dt.parse(text); + } + + @Override + public String print(Date object, Locale locale) { + return new SimpleDateFormat(DATE_TIME_FORMAT).format(object); + } + }; + } +} diff --git a/src/main/java/com/palnet/biz/config/JsonConfig.java b/src/main/java/com/palnet/biz/config/JsonConfig.java index 948a017..6f63801 100644 --- a/src/main/java/com/palnet/biz/config/JsonConfig.java +++ b/src/main/java/com/palnet/biz/config/JsonConfig.java @@ -1,6 +1,8 @@ package com.palnet.biz.config; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; @@ -11,6 +13,8 @@ import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.time.format.DateTimeFormatter; import java.util.TimeZone; @@ -22,23 +26,31 @@ public class JsonConfig { private static final String timeFormat = "HH:mm:ss"; private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss"; + /* + */ @Bean + @Primary public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() { return builder -> { -// builder.timeZone(TimeZone.getTimeZone("UTC")); + builder.timeZone(TimeZone.getTimeZone("UTC")); builder.simpleDateFormat(dateTimeFormat); builder.serializers(new LocalTimeSerializer(DateTimeFormatter.ofPattern(timeFormat))); builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat))); builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat))); + builder.serializationInclusion(JsonInclude.Include.NON_NULL); + builder.serializationInclusion(JsonInclude.Include.NON_EMPTY); builder.deserializers(new LocalTimeDeserializer(DateTimeFormatter.ofPattern(timeFormat))); builder.deserializers(new LocalDateDeserializer(DateTimeFormatter.ofPattern(dateFormat))); builder.deserializers(new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(dateTimeFormat))); + builder.featuresToDisable(SerializationFeature.FAIL_ON_EMPTY_BEANS); builder.featuresToDisable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE); builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + builder.featuresToDisable(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES); }; } + } diff --git a/src/main/java/com/palnet/biz/config/SwaggerConfig.java b/src/main/java/com/palnet/biz/config/SwaggerConfig.java new file mode 100644 index 0000000..6a77d90 --- /dev/null +++ b/src/main/java/com/palnet/biz/config/SwaggerConfig.java @@ -0,0 +1,71 @@ +package com.palnet.biz.config; + +import io.swagger.v3.oas.models.parameters.Parameter; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; +import springfox.documentation.service.SecurityReference; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +@Configuration +//@EnableSwagger2 +public class SwaggerConfig { + + + @Bean + public Docket api() { + return new Docket(DocumentationType.OAS_30) // open api spec 3.0 + .apiInfo(new ApiInfoBuilder().version("1.0").title("PAV").build()) + .forCodeGeneration(true).securitySchemes(Arrays.asList(apiKey())) + .select() + .apis(RequestHandlerSelectors.any()) + .paths(PathSelectors.any()) + .build() + .apiInfo(apiInfo()) + .directModelSubstitute(Date.class, String.class) + .directModelSubstitute(LocalDate.class, String.class) + .directModelSubstitute(LocalDateTime.class, String.class) + .securityContexts(Arrays.asList(securityContext())) + .securitySchemes(Arrays.asList(apiKey())); + } + + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("PAV API") + .description("----") + .version("1.0") + .build(); + } + + //ApiKey 정의 + private ApiKey apiKey() { + return new ApiKey("Authorization", "Authorization", "header"); + } + + //JWT SecurityContext 구성 + private SecurityContext securityContext() { + return SecurityContext.builder().securityReferences(defaultAuth()).build(); + } + + private List defaultAuth() { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEveryThing"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + return Arrays.asList(new SecurityReference("Authorization", authorizationScopes)); + } +}