Skip to content
广告❤️成为赞助商

类型处理器

类型处理器,作用于实体类字段的赋值和转换

说明:

  • 比如字段类型为是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;

}