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)); + } +}