Skip to content

Provide read/write customization hooks for GenericJackson2JsonRedisSerializer #2322

Closed
@ashraf-revo

Description

@ashraf-revo

ObjectMapper provide writerWithView method for controlling which property to be serialize this make us able to adjust and make sure which properties written to the cache server
for example

public class User {
    @JsonView(Views.Basic.class)
    public int id;
    @JsonView(Views.Basic.class)
    public String name;
    @JsonView(Views.Detailed.class)
    public String email;
    @JsonView(Views.Detailed.class)
    public String mobile;
}


public class Views {
    public static class Basic {
    }
    public static class Detailed {
    }
    public static class ViewBasic extends Basic{
    }
    public static class ViewDetailed extends ViewBasic , Detailed {
    }
}

so if we want to cache only id,name we only pass ViewBasic to the WriterView

for example

objectMapper.writerWithView(Views.ViewBasic.class).writeValueAsBytes(user)

if we need basic+email,mobile we should pass ViewDetailed to the WriterView

easy fix

we could override GenericJackson2JsonRedisSerializer.serialize
with this code

    @Override
    public byte[] serialize(Object source) throws SerializationException {
        if (source == null) {
            return EMPTY_ARRAY;
        }
        try {
            if (source instanceof CacheView) {
                CacheView cacheView = (CacheView) source;
                return cachingObjectMapper.writerWithView(cacheView.getCacheView()).writeValueAsBytes(source);
            } else {
                return cachingObjectMapper.writeValueAsBytes(source);
            }
        } catch (JsonProcessingException e) {
            throw new SerializationException("Could not write JSON: " + e.getMessage(), e);
        }
    }

    import com.fasterxml.jackson.annotation.JsonIgnore;

    public interface CacheView {
        @JsonIgnore
        Class<?> getCacheView();
    }

public class User implements Serializable, CacheView{
    @JsonView(Views.Basic.class)
    public int id;
    @JsonView(Views.Basic.class)
    public String name;
    @JsonView(Views.Detailed.class)
    public String email;
    @JsonView(Views.Detailed.class)
    public String mobile;

    private Class<?> cacheView;

}

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions