Jackson使用ノート
Mybatis-plusのJacksonType-Handlerを使用してリストを逆シーケンス化できないJacksonType-HandlerクラスのシミュレーションJacksonType-HandlerクラスはカスタムListType-Handlerを書いて解析し、現在、各リストにListType-Handlerから継承されたListBeanType-Handler ListType-Handlerクラスを書く必要がある.
ListUserTypeHandlerは、書き方1で、ListTypeHandlerから継承し、汎用タイプを指定するだけで簡単です.
書き方2:parseメソッドを上書きすると、効率が向上します
使用方法は以下の通りであるが,米国で不足しているのは,各リストにそれぞれのTypeHandlerを定義する必要があることである.
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.io.IOException;
import java.lang.reflect.Type;
import java.lang.reflect.ParameterizedType;
import java.util.List;
/**
* Created by angryfun on 2020/7/7.
*/
@Slf4j
@MappedTypes({List.class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public abstract class ListTypeHandler<T> extends AbstractJsonTypeHandler<Object> {
protected static ObjectMapper objectMapper = new ObjectMapper();
private Class<?> type;
public ListTypeHandler(){}
public ListTypeHandler(Class<?> type) {
if(log.isTraceEnabled()) {
log.trace("JacksonTypeHandler(" + type + ")");
}
Assert.notNull(type, "Type argument cannot be null", new Object[0]);
this.type = type;
}
protected Object parse(String json) {
try {
Type type = getSuperGenricTypes(this.getClass());
JavaType javaType = objectMapper.getTypeFactory().constructType(type);
return objectMapper.readValue(json, javaType);
} catch (IOException var3) {
throw new RuntimeException(var3);
}
}
protected String toJson(Object obj) {
try {
return objectMapper.writeValueAsString(obj);
} catch (JsonProcessingException var3) {
throw new RuntimeException(var3);
}
}
public static void setObjectMapper(ObjectMapper objectMapper) {
Assert.notNull(objectMapper, "ObjectMapper should not be null", new Object[0]);
objectMapper = objectMapper;
}
public static Type getSuperGenricTypes(final Class<?> clz) {
Class<?> superClass = clz;
Type type = superClass.getGenericSuperclass();
while (superClass != Object.class && !(type instanceof ParameterizedType)) {
superClass = superClass.getSuperclass();
type = superClass.getGenericSuperclass();
}
if (superClass == Object.class) {
throw new IllegalArgumentException(" :" + clz);
}
return ((ParameterizedType) type).getActualTypeArguments()[0];
}
}
ListUserTypeHandlerは、書き方1で、ListTypeHandlerから継承し、汎用タイプを指定するだけで簡単です.
public class ListUserTypeHandler extends ListTypeHandler<List<User>>{}
書き方2:parseメソッドを上書きすると、効率が向上します
public class ListUserTypeHandler extends ListTypeHandler<List<User>>{
private TypeReference typeReference = new TypeReference<List<User>>() {};
/**
* , JavaType
* @param json
* @return
*/
@Override
protected Object parse(String json) {
try {
return objectMapper.readValue(json, typeReference);
} catch (IOException var3) {
throw new RuntimeException(var3);
}
}
}
使用方法は以下の通りであるが,米国で不足しているのは,各リストにそれぞれのTypeHandlerを定義する必要があることである.
@TableField(typeHandler = ListUserTypeHandler.class)