diff --git a/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/converter/BaseEnumConverter.java b/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/converter/BaseEnumConverter.java new file mode 100644 index 00000000..7f894eff --- /dev/null +++ b/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/converter/BaseEnumConverter.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.continew.starter.web.autoconfigure.converter; + +import org.springframework.core.convert.converter.Converter; +import top.continew.starter.core.enums.BaseEnum; +import top.continew.starter.core.util.validate.ValidationUtils; + +import java.util.HashMap; +import java.util.Map; + +/** + * BaseEnum 参数转换器 + * + * @author Charles7c + * @since 2.4.0 + */ +public class BaseEnumConverter implements Converter { + + private final Map enumMap = new HashMap<>(); + + public BaseEnumConverter(Class enumType) { + T[] enums = enumType.getEnumConstants(); + for (T e : enums) { + enumMap.put(String.valueOf(e.getValue()), e); + } + } + + @Override + public T convert(String source) { + T t = enumMap.get(source); + ValidationUtils.throwIfNull(t, "枚举值非法:{}", source); + return t; + } +} diff --git a/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/converter/BaseEnumConverterAutoConfiguration.java b/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/converter/BaseEnumConverterAutoConfiguration.java new file mode 100644 index 00000000..32d5ee49 --- /dev/null +++ b/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/converter/BaseEnumConverterAutoConfiguration.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.continew.starter.web.autoconfigure.converter; + +import jakarta.annotation.PostConstruct; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.format.FormatterRegistry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * BaseEnum 参数转换自动配置 + * + * @author Charles7c + * @since 2.4.0 + */ +@EnableWebMvc +@AutoConfiguration +public class BaseEnumConverterAutoConfiguration implements WebMvcConfigurer { + + private static final Logger log = LoggerFactory.getLogger(BaseEnumConverterAutoConfiguration.class); + + @Override + public void addFormatters(FormatterRegistry registry) { + registry.addConverterFactory(new BaseEnumConverterFactory()); + } + + @PostConstruct + public void postConstruct() { + log.debug("[ContiNew Starter] - Auto Configuration 'Web-BaseEnum Converter' completed initialization."); + } +} diff --git a/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/converter/BaseEnumConverterFactory.java b/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/converter/BaseEnumConverterFactory.java new file mode 100644 index 00000000..80428896 --- /dev/null +++ b/continew-starter-web/src/main/java/top/continew/starter/web/autoconfigure/converter/BaseEnumConverterFactory.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.continew.starter.web.autoconfigure.converter; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.converter.ConverterFactory; +import top.continew.starter.core.enums.BaseEnum; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * BaseEnum 参数转换器工厂 + * + * @author Charles7c + * @since 2.4.0 + */ +public class BaseEnumConverterFactory implements ConverterFactory { + + private static final Map CONVERTER_CACHE = new ConcurrentHashMap<>(); + + @Override + public Converter getConverter(Class targetType) { + return CONVERTER_CACHE.computeIfAbsent(targetType, key -> new BaseEnumConverter<>(targetType)); + } +} diff --git a/continew-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/continew-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 44b71c06..2e12da78 100644 --- a/continew-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/continew-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1,3 +1,4 @@ +top.continew.starter.web.autoconfigure.converter.BaseEnumConverterAutoConfiguration top.continew.starter.web.autoconfigure.cors.CorsAutoConfiguration top.continew.starter.web.autoconfigure.trace.TraceAutoConfiguration -top.continew.starter.web.autoconfigure.xss.XssAutoConfiguration \ No newline at end of file +top.continew.starter.web.autoconfigure.xss.XssAutoConfiguration