Переглянути джерело

增加`::stringify`、`::json`转换器

mxd 4 роки тому
батько
коміт
cad6c0f3bc

+ 5 - 0
pom.xml

@@ -59,6 +59,11 @@
             <artifactId>spring-boot-starter-data-redis</artifactId>
             <scope>provided</scope>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.75</version>
+        </dependency>
         <dependency>
             <groupId>io.springfox</groupId>
             <artifactId>springfox-swagger2</artifactId>

+ 1 - 1
src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicAPIAutoConfiguration.java

@@ -65,7 +65,7 @@ import java.util.function.BiFunction;
 @Configuration
 @ConditionalOnClass({RequestMappingHandlerMapping.class})
 @EnableConfigurationProperties(MagicAPIProperties.class)
-@Import({MagicRedisAutoConfiguration.class, MagicMongoAutoConfiguration.class, MagicSwaggerConfiguration.class})
+@Import({MagicRedisAutoConfiguration.class, MagicMongoAutoConfiguration.class, MagicSwaggerConfiguration.class, MagicJsonAutoConfiguration.class})
 public class MagicAPIAutoConfiguration implements WebMvcConfigurer {
 
 	private static final Logger logger = LoggerFactory.getLogger(MagicAPIAutoConfiguration.class);

+ 91 - 0
src/main/java/org/ssssssss/magicapi/spring/boot/starter/MagicJsonAutoConfiguration.java

@@ -0,0 +1,91 @@
+package org.ssssssss.magicapi.spring.boot.starter;
+
+import com.alibaba.fastjson.JSON;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.boot.autoconfigure.AutoConfigureBefore;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Configuration;
+import org.ssssssss.magicapi.utils.IoUtils;
+import org.ssssssss.script.exception.MagicScriptException;
+import org.ssssssss.script.parsing.ast.statement.ClassConverter;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.function.Function;
+
+@Configuration
+@AutoConfigureBefore(MagicAPIAutoConfiguration.class)
+public class MagicJsonAutoConfiguration {
+
+	private static void register(Function<String, Object> processString, Function<byte[], Object> processBytes, Function<Object, String> stringify) {
+		register(processString, processBytes, IoUtils::bytes, stringify);
+	}
+
+	private static void register(Function<String, Object> processString, Function<byte[], Object> processBytes, Function<InputStream, Object> processInputStream, Function<Object, String> stringify) {
+		ClassConverter.register("json", (value, params) -> {
+			if (value == null) {
+				return params != null && params.length > 0 ? params[0] : null;
+			} else if (value instanceof CharSequence) {
+				return processString.apply(value.toString());
+			} else if (value instanceof byte[]) {
+				return processBytes.apply((byte[]) value);
+			} else if (value instanceof InputStream) {
+				return processInputStream.apply((InputStream) value);
+			}
+			throw new MagicScriptException(String.format("不支持的类型:%s", value.getClass()));
+		});
+		ClassConverter.register("stringify", (value, params) -> {
+			if (value == null) {
+				return params != null && params.length > 0 ? params[0] : null;
+			}
+			return stringify.apply(value);
+		});
+	}
+
+	@ConditionalOnBean({ObjectMapper.class})
+	@Configuration
+	static class JacksonAutoConfiguration {
+
+
+		JacksonAutoConfiguration(ObjectMapper objectMapper) {
+			register(str -> {
+				try {
+					return objectMapper.readValue(str, Object.class);
+				} catch (IOException e) {
+					throw new RuntimeException(e);
+				}
+			}, bytes -> {
+				try {
+					return objectMapper.readValue(bytes, Object.class);
+				} catch (IOException e) {
+					throw new RuntimeException(e);
+				}
+			}, is -> {
+				try {
+					return objectMapper.readValue(is, Object.class);
+				} catch (IOException e) {
+					throw new RuntimeException(e);
+				}
+			}, object -> {
+				try {
+					return objectMapper.writeValueAsString(object);
+				} catch (JsonProcessingException e) {
+					throw new RuntimeException(e);
+				}
+			});
+		}
+	}
+
+	@ConditionalOnMissingBean({ObjectMapper.class})
+	@ConditionalOnClass(JSON.class)
+	@Configuration
+	static class FastJsonAutoConfiguration {
+
+		FastJsonAutoConfiguration() {
+			register(JSON::parse, JSON::parse, JSON::toJSONString);
+		}
+	}
+}