类型处理器
类型处理器,作用于实体类字段的赋值和转换
说明:
- 比如字段类型为是InputStream,则需要将内容转为byte[]存入,查询时需要将MongoDB返回的
Binary
类转回InputStream - 类型处理器优先级比转换器和映射器高,因为TypeHandler作用于字段
- 在实体类上使用类型处理器时,需要实现类型处理器的两个方法,如果返回null,则继续走MongoPlus的处理,反之则直接使用类型处理器各个方法返回的数据
- 通过实体类字段的
CollectionField
注解的'typeHandler'传入,如@CollectionField(typeHandler = InputStreamTypeHandler.class)
com.anwen.mongo.handlers.TypeHandler
- 该接口是类型处理器的接口,所有类型处理器都应实现此接口,实现接口中的方法
- setParameter: 设置值
- getResult: 获取结果
示例
首先,需要将类型处理器类实现TypeHandler接口,设置泛型类型为字段的类,通过CollectionField注解的typeHandler属性传入
java
//使用InputStream演示
public class InputStreamHandler implements TypeHandler<InputStream> {}
接下来,实现TypeHandler接口中的mapping方法,就可以写映射策略了
java
public class InputStreamHandler implements TypeHandler<InputStream> {
@Override
public Object setParameter(String fieldName, InputStream obj) {
try(ByteArrayOutputStream bos = new ByteArrayOutputStream()){
byte[] b = new byte[1024];
int len;
while ((len = obj.read(b)) != -1) {
bos.write(b, 0, len);
}
//将InputStream转成byte[]并返回
return bos.toByteArray();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public InputStream getResult(Object obj) {
// 经过setParameter方法设置值后,查询出来的数据一定会是Binary类型,所以只需强转后获取byte[],然后转为InputStream
return new ByteArrayInputStream(((Binary)obj).getData());
}
}
最后我们在实体类中应用
java
@CollectionName(value = "user")
public class User {
@ID(type = IdTypeEnum.ASSIGN_ID)
private String userId;
@CollectionField(typeHandler = InputStreamHandler.class) // 设置typeHandler属性,将我们写好的类型处理器传入
private InputStream file;
}