前言
如你所见, 该篇是jackson序列化操作的再次应用。将数据库中的 FreeMarker
表达式处理为变量返回给前端。同时将前端提交的变量处理为 FreeMarker
表达式存入数据库。
案例
1 2 3
| public enum FieldType { FREE_MARKER }
|
1 2 3 4 5 6 7 8 9
| @Retention(RetentionPolicy.RUNTIME) @JacksonAnnotationsInside @JsonSerialize(using = FieldSerialize.class) @JsonDeserialize(using = FieldDeserialize.class) public @interface FieldHandler {
public FieldType value() default FieldType.FREE_MARKER;
}
|
自定义序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| @Component public class FieldSerialize extends JsonSerializer<String> implements ContextualSerializer {
private static FreeMarkerDictService freeMarkerDictService;
private FieldType fieldType;
public FieldSerialize() { this.fieldType = FieldType.FREE_MARKER;
}
public FieldSerialize(FieldType fieldType) { this.fieldType = fieldType; }
@Autowired public FieldSerialize(FreeMarkerDictService freeMarkerDictService) { this.freeMarkerDictService = freeMarkerDictService; }
@Override public void serialize(String s, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { List<AiFreeMarkerDict> freeMarkerDicts = freeMarkerDictService.list(); switch (fieldType) { case FREE_MARKER: jsonGenerator.writeString(FieldUtils.freemarkerExpression2Variable(s, freeMarkerDicts)); break; } }
@Override public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException { if (beanProperty != null) { if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) { FieldHandler fieldHandler = beanProperty.getAnnotation(FieldHandler.class); if (fieldHandler == null) { fieldHandler = beanProperty.getContextAnnotation(FieldHandler.class); } if (fieldHandler != null) { return new FieldSerialize(fieldHandler.value()); } } return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty); } return serializerProvider.findNullValueSerializer(beanProperty); } }
|
反序列化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| @Component public class FieldDeserialize extends JsonDeserializer<String> implements ContextualDeserializer {
private static FreeMarkerDictService freeMarkerDictService;
private FieldType fieldType;
public FieldDeserialize() { this.fieldType = FieldType.FREE_MARKER;
}
public FieldDeserialize(FieldType fieldType) { this.fieldType = fieldType; }
@Autowired public FieldDeserialize(FreeMarkerDictService freeMarkerDictService) { this.freeMarkerDictService = freeMarkerDictService; }
@Override public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { List<AiFreeMarkerDict> freeMarkerDicts = freeMarkerDictService.list(); String freeMarkerVariable = jsonParser.getText(); return FieldUtils.freemarkerVariable2Expression(freeMarkerVariable, freeMarkerDicts); }
@Override public JsonDeserializer<?> createContextual(DeserializationContext deserializationContext, BeanProperty beanProperty) throws JsonMappingException { if (beanProperty != null) { if (Objects.equals(beanProperty.getType().getRawClass(), String.class)) { FieldHandler fieldHandler = beanProperty.getAnnotation(FieldHandler.class); if (fieldHandler == null) { fieldHandler = beanProperty.getContextAnnotation(FieldHandler.class); } if (fieldHandler != null) { return new FieldDeserialize(fieldHandler.value()); } } return deserializationContext.findRootValueDeserializer(beanProperty.getType()); } return deserializationContext.findRootValueDeserializer(beanProperty.getType()); }
}
|
工具
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| public class FieldUtils {
public static String freemarkerExpression2Variable(String expression, final List<AiFreeMarkerDict> freeMarkerDictList) { if (CollectionUtils.isNotEmpty(freeMarkerDictList)) { for (AiFreeMarkerDict freeMarkerDict : freeMarkerDictList) { if (expression.contains(freeMarkerDict.getExpression())) { expression = expression.replace(freeMarkerDict.getExpression(), freeMarkerDict.getVariable()); } } } return expression; }
public static String freemarkerVariable2Expression(String variable, final List<AiFreeMarkerDict> freeMarkerDataList) { if (CollectionUtils.isNotEmpty(freeMarkerDataList)) { for (AiFreeMarkerDict freeMarkerDict : freeMarkerDataList) { if (variable.contains(freeMarkerDict.getVariable())) { variable = variable.replace(freeMarkerDict.getVariable(), freeMarkerDict.getExpression()); } } return variable; } throw new FreeMarkerException("非法变量"); } }
|
使用只要在需要处理的字段上添加注解即可
1 2 3
| @FieldHandler @ApiModelProperty(value = "提问内容") private String content;
|
最终效果: 数据库如下数据
1
| <#if memory.Country??>${memory.Country}</#if>
|
api接口返回
最后
本文到此结束,感谢阅读。如果您觉得不错,请关注公众号【当我遇上你】,您的支持是我写作的最大动力。