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

Type Handler ​

Type handlers are applied to entity class fields for assignment and conversion.

Note

  • For example, if the field type is InputStream, the content needs to be converted to byte[] for storage, and when querying, the Binary class returned by MongoDB should be converted back to InputStream.
  • Type handlers have higher priority than converters and mappers because TypeHandler operates at the field level.
  • When using a type handler on an entity class, you need to implement two methods of the type handler. If it returns null, MongoPlus processing continues; otherwise, the data returned by the type handler's methods is used directly.
  • Pass the type handler through the typeHandler property of the CollectionField annotation on the entity class field, e.g., @CollectionField(typeHandler = InputStreamTypeHandler.class).

com.mongoplus.handlers.TypeHandler ​

  • This interface defines a type handler. All type handlers should implement this interface and its methods.
  • setParameter: Sets the value.
  • getResult: Retrieves the result.

Example ​

First, implement the TypeHandler interface in your type handler class and set the generic type to the field type. Pass it via the typeHandler property of the CollectionField annotation. ​
java
// Example using InputStream
public class InputStreamHandler implements TypeHandler<InputStream> {}
Next, implement the mapping methods of the TypeHandler interface to define the mapping strategy. ​
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);
            }
            // Convert InputStream to byte[] and return
            return bos.toByteArray();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public InputStream getResult(Object obj) {
        // After setParameter, the retrieved data will be of type Binary
        // Cast to Binary, get byte[], then convert to InputStream
        return new ByteArrayInputStream(((Binary)obj).getData());
    }
}
Finally, apply it in the entity class. ​
java
@CollectionName(value = "user")
public class User {

    @ID(type = IdTypeEnum.ASSIGN_ID)
    private String userId;

    @CollectionField(typeHandler = InputStreamHandler.class) // Set the typeHandler property and pass in our custom type handler
    private InputStream file;

}