Spring Boot REST API无需@EnableWebMvc实现Long转String方案咨询
解决Java Long转String(不使用@EnableWebMvc)
你的配置未生效的核心原因是:直接通过configureMessageConverters添加自定义转换器,没有覆盖或修改Spring Boot默认的Jackson消息转换器,且自定义的ObjectMapper未复用容器中已配置的实例,导致序列化规则未被全局应用。以下是两种可行的解决方案:
方案一:修改现有Jackson转换器(推荐)
通过extendMessageConverters方法,在Spring Boot默认的转换器基础上修改,而非替换整个转换器列表:
package com.dolphin.soa.post.config; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.List; @Configuration public class WebConvertConfig implements WebMvcConfigurer { @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { // 遍历找到默认的Jackson转换器,修改其ObjectMapper for (HttpMessageConverter<?> converter : converters) { if (converter instanceof MappingJackson2HttpMessageConverter) { MappingJackson2HttpMessageConverter jacksonConverter = (MappingJackson2HttpMessageConverter) converter; SimpleModule simpleModule = new SimpleModule(); // 注册Long类型的字符串序列化器 simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); jacksonConverter.getObjectMapper().registerModule(simpleModule); break; } } } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("swagger-ui.html") .addResourceLocations("classpath:/META-INF/resources/"); registry.addResourceHandler("/webjars/**") .addResourceLocations("classpath:/META-INF/resources/webjars/"); } }
方案二:全局定制ObjectMapper(更简洁)
通过Jackson2ObjectMapperBuilderCustomizer Bean直接定制全局的ObjectMapper,Spring会自动将配置应用到默认的消息转换器上:
package com.dolphin.soa.post.config; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilderCustomizer; @Configuration public class JacksonConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer longToStringSerializerCustomizer() { return builder -> { SimpleModule module = new SimpleModule(); module.addSerializer(Long.class, ToStringSerializer.instance); module.addSerializer(Long.TYPE, ToStringSerializer.instance); builder.modules(module); }; } }
可选:局部字段转换
如果不需要全局转换,仅针对特定字段,可以在实体类字段上添加注解:
public class Post { // 仅该Long字段会被序列化为字符串 @JsonSerialize(using = ToStringSerializer.class) private Long postId; // 其他字段... }
内容的提问来源于stack exchange,提问作者Dolphin
相关产品推荐
相关产品推荐

