1

上下文: 我们正在使用 com.fasterxml.jackson.databind.ObjectMapper 的readValue()方法将 JSON 转换为 Java POJO。当发生JsonParseExceptionJsonMappingException时,将在日志中打印原始数据摘录(JSON 内容)。

问题: 我们的 JSON 可能包含敏感数据,因此不应记录它以满足安全合规性。

我们正在考虑的选项...

选项 1:使用JsonParseExceptionJsonMappingException包装 readValue() 方法并添加clearLocation()

仅供参考...... JsonParseExceptionJsonMappingException上的clearLocation()从异常消息中删除上下文信息

        try {
            objectMapper.readValue(jsonContent, pojoObject);
        } catch (JsonParseException | JsonMappingException e) {
            e.clearLocation();
            throw e;
        } 

该解决方案的缺点是,readValue()方法在多个应用程序的很多地方都使用。所以我们需要处理大量的代码更改。我们不应该忘记在未来的实现中调用clearLocation() 。

选项 2:创建自定义 ObjectMapper

public class CustomObjectMapper {
    private static ObjectMapper objectMapper = new ObjectMapper();
    
    // showing only one method to simplify
    public static <T> T convertJsonToPojo(String content, Class<T> valueType)
            throws IOException, JsonParseException, JsonMappingException {
        try {
            return objectMapper.readValue(content, valueType);
        } catch (JsonParseException | JsonMappingException e) {
            e.clearLocation();
            throw e;
        } catch (JsonProcessingException e) {
            e.clearLocation();
            throw e;
        } catch (Exception e) {
            throw e;
        }
    }
}

如果您遇到类似情况并以不同方式处理,请告诉我。

4

1 回答 1

1

您可以使用方面;

@Aspect
@Component
public class OMAspect {

    @Around("within(<your base package>..*)")
    public Object aroundOMMethods(ProceedingJoinPoint joinPoint) throws Throwable {
        try {
           return joinPoint.proceed();
        } catch (JsonProcessingException e) {
            e.clearLocation();
            throw e;
        } catch (Throwable e) {
            throw e;
        }
    }
}
于 2021-08-17T10:45:54.870 回答