You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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组件,可按以下修改:

  1. 给Paragraph添加@Component注解:
@Component
public class Paragraph extends HcmsComponent{
    @JsonWrapped("content")
    public String text;
}
  1. 测试类中通过@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,推荐用构造函数注入:

  1. 修改抽象类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);
    }
}
  1. 修改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);
    }
}
  1. 测试类中注入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 15:08:25