适配IntelliJ默认格式化的FasterXML TypeReference替代方案
解决Jackson TypeReference格式化换行的替代方案
在使用Jackson的ObjectMapper.readValue处理泛型类型时,常规写法依赖匿名内部类实现TypeReference:
new ObjectMapper().readValue(someSourceValue, new TypeReference<Map<String, Object>>() {});
经IntelliJ格式化后会自动换行,破坏代码紧凑性:
new ObjectMapper().readValue(someSourceValue, new TypeReference<Map<String, Object>>() { });
以下是几种Jackson原生支持或可自定义的解决方案:
1. 使用Jackson原生TypeFactory构建泛型类型
无需匿名类,直接通过TypeFactory的constructParametricType方法构建泛型JavaType,写法紧凑且格式化后不会换行:
new ObjectMapper().readValue(someSourceValue, new ObjectMapper().getTypeFactory().constructParametricType(Map.class, String.class, Object.class));
如果需要复用TypeFactory,可以提前获取实例:
TypeFactory typeFactory = new ObjectMapper().getTypeFactory(); new ObjectMapper().readValue(someSourceValue, typeFactory.constructParametricType(Map.class, String.class, Object.class));
2. 自定义工具类实现Builder风格
如果偏好类似TypeReferenceBuilder的语法,可以自行实现极简工具类,避免匿名类的格式化问题:
public final class TypeRefs { private TypeRefs() {} @SuppressWarnings("unchecked") public static <T> TypeReference<T> of() { return new TypeReference<T>() {}; } }
使用时结合泛型显式指定,写法紧凑:
new ObjectMapper().readValue(someSourceValue, TypeRefs.<Map<String, Object>>of());
3. 调整IntelliJ格式化规则(无需修改代码)
直接修改IDE的代码样式设置,让匿名类大括号保持在行尾:
- 打开
Settings→Editor→Code Style→Java - 切换到
Braces Placement标签页 - 找到
Anonymous classes选项,设置为End of line - 应用设置后,格式化代码时会保留一行写法:
new ObjectMapper().readValue(someSourceValue, new TypeReference<Map<String, Object>>() {});
内容的提问来源于stack exchange,提问作者Nicholas DiPiazza
相关产品推荐
相关产品推荐

