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
相关产品推荐
相关产品推荐

