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

Spring纯注解下如何用MappingJackson2HttpMessageConverter返回序列化对象?

解决Spring MVC返回对象时的"No converter found"错误并简化纯注解配置

我来帮你排查这个问题,你的核心问题是WebMvc的配置没有被正确加载,导致Spring找不到Jackson转换器来序列化Version对象,咱们一步步来修复并简化配置:

问题根源分析

你的Kernel类同时承担了DispatcherServlet初始化器和WebMvc配置类两个角色,但在createServletApplicationContext()方法里只注册了VersionController,并没有注册Kernel自己。这就导致@EnableWebMvc注解和你重写的configureMessageConverters()方法完全没有生效——Spring根本没加载到这些配置,自然不知道要启用Jackson转换器。

另外,@RestController注解已经包含了@ResponseBody的功能,所以控制器里的@ResponseBody是多余的,可以去掉。

修复&简化配置步骤

1. 拆分配置类,明确职责

把初始化器和WebMvc配置分开,让代码更清晰,也避免配置加载失效:

创建单独的WebMvc配置类

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = "pl.protean.league-craft") // 替换成你控制器所在的包路径
public class WebConfig implements WebMvcConfigurer {
    // 划重点:当classpath里存在jackson-databind依赖时,@EnableWebMvc会自动注册MappingJackson2HttpMessageConverter
    // 所以不需要手动添加转换器,除非你要自定义Jackson的配置(比如日期格式、序列化规则等)
    // 如果需要自定义,用extendMessageConverters而不是configureMessageConverters,后者会替换默认转换器列表
    // 示例自定义配置(可选):
    /*
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        ObjectMapper objectMapper = new ObjectMapper();
        // 添加自定义配置,比如忽略空值
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
    }
    */
}

创建单独的DispatcherServlet初始化器

public class AppInitializer extends AbstractDispatcherServletInitializer {
    @Override
    protected WebApplicationContext createServletApplicationContext() {
        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
        ctx.register(WebConfig.class); // 注册WebMvc配置类,确保配置生效
        return ctx;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"}; // 简化映射规则,匹配所有请求
    }

    @Override
    protected WebApplicationContext createRootApplicationContext() {
        return null; // 不需要根上下文的话保持null即可
    }
}

2. 简化控制器代码

去掉多余的@ResponseBody,因为@RestController已经包含了这个注解:

@RestController
public class VersionController {
    @GetMapping("/version") // 用@GetMapping代替@RequestMapping,语义更明确
    public Version getVersion() {
        return new Version(192837, "DEV");
    }
}

3. 修正Maven插件配置

你的项目是WAR包,不需要maven-shade-plugin(这个插件主要用于打包可执行JAR),可以直接移除它,只保留maven-war-plugin即可:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.2.2</version>
            <configuration>
                <warName>lc</warName>
                <failOnMissingWebXml>false</failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>

验证效果

重新打包部署项目后,访问/version接口,应该会返回如下JSON格式的响应:

{"build":192837,"releaseType":"DEV"}

内容的提问来源于stack exchange,提问作者Bartłomiej Sobieszek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:46:04