Spring Boot自定义ObjectMapper自动装配失败排查求助
依赖注入失效原因及解决办法
核心原因
- 非Spring容器管理的对象无法触发依赖注入:你通过
ParagraphMock.createParagraphWithID(1)手动创建的Paragraph实例,不属于Spring容器管理的Bean。Spring只会对自己实例化的对象执行依赖注入逻辑,手动new出来的对象Spring根本不知道它的存在,自然不会给mapper字段赋值,导致空指针异常。 - 抽象类的@Autowired仅对Spring托管的子类生效:
HcmsEntity中的@Autowired ObjectMapper,只有当子类(比如Paragraph)被Spring容器实例化时(比如标记@Component、通过@Bean注册),Spring才会完成注入。手动创建的子类对象不满足这个条件。
解决方案
方案一:让Paragraph成为Spring托管Bean(适合非实体类场景)
如果Paragraph适合作为Spring组件,可按以下修改:
- 给
Paragraph添加@Component注解:
@Component public class Paragraph extends HcmsComponent{ @JsonWrapped("content") public String text; }
- 测试类中通过
@Autowired获取Spring管理的Paragraph实例,而非手动创建:
@SpringBootTest public class ParagraphTest { @Autowired private Paragraph paragraph; @Test void serializeParagraph() { paragraph.setIdentifier("p:1:1.p"); // 补充设置text等必要属性 assertThat(paragraph.serialize()).hasToString(ParagraphMock.getExpectedJson(1)); } }
方案二:构造函数注入+手动传递(适合实体类场景)
如果Paragraph是业务实体,不适合作为Spring Bean,推荐用构造函数注入:
- 修改抽象类
HcmsEntity,将字段注入改为构造函数注入:
public abstract class HcmsEntity implements JsonSerializable { private final ObjectMapper mapper; public HcmsEntity(ObjectMapper mapper) { this.mapper = mapper; } @Override public JsonNode serialize() { return this.mapper.valueToTree(this); } }
- 修改
Paragraph(及父类HcmsComponent),确保传递构造参数:
// 假设HcmsComponent继承自HcmsEntity public class HcmsComponent extends HcmsEntity { public HcmsComponent(ObjectMapper mapper) { super(mapper); } } public class Paragraph extends HcmsComponent{ @JsonWrapped("content") public String text; public Paragraph(ObjectMapper mapper) { super(mapper); } }
- 测试类中注入
ObjectMapper,创建Paragraph时手动传入:
@SpringBootTest public class ParagraphTest { @Autowired private ObjectMapper mapper; @Test void serializeParagraph() { Paragraph paragraph = new Paragraph(mapper); paragraph.setIdentifier("p:1:1.p"); // 补充设置text等必要属性 assertThat(paragraph.serialize()).hasToString(ParagraphMock.getExpectedJson(1)); } }
额外说明
你自定义的CustomJacksonConfig中的ObjectMapper Bean是有效的,Spring Boot会将其作为全局实例使用,只要注入方式正确,就能拿到这个自定义实例。
内容的提问来源于stack exchange,提问作者user66875
相关产品推荐
相关产品推荐

