Here is a solution to your problem using a custom JsonSerializer. From this follows a blog post .
Create your own serializer
public class MaskingSerializer extends JsonSerializer < MyBean > { @ Override public void serialize(MyBean value, JsonGenerator jGen, SerializerProvider serializers) throws IOException, JsonProcessingException { jGen.writeStartObject(); Field[] fields = value.getClass().getDeclaredFields(); for (Field field: fields) { field.setAccessible(true); MaskSensitiveData mask = field.getDeclaredAnnotation(MaskSensitiveData.class); try { if (mask != null) { field.setAccessible(true); field.set(value, field.get(value).toString().replaceAll(".", "*")); } jGen.writeStringField(field.getName(), field.get(value).toString()); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } jGen.writeEndObject(); } }
Create a module to combine serializer
public class MaskingModule extends SimpleModule { private static final String NAME = "CustomIntervalModule"; private static final VersionUtil VERSION_UTIL = new VersionUtil() {}; public MaskingModule() { super(NAME, VERSION_UTIL.version()); addSerializer(MyBean.class, new MaskingSerializer()); } }
Register a module using ObjectMapper.
public class CustomObjectMapper extends ObjectMapper { public CustomObjectMapper() { registerModule(new MaskingModule()); } }
Check code
public class MyBeanTest { private static final CustomObjectMapper OBJECT_MAPPER = new CustomObjectMapper(); @Test public void testIntervalSerialization() throws Exception { MyBean mb = new MyBean(); mb.setAbc("value"); mb.setCardNumber("4441114443335551"); mb.setUserName("User"); mb.setXyz("value"); String result = OBJECT_MAPPER.writeValueAsString(mb); System.out.println(result); String expected = "{\"userName\":\"User\",\"cardNumber\":\"****************\",\"abc\":\"value\",\"xyz\":\"value\"}"; Assert.assertEquals(expected, result); } }
source share