对于Long 类型的数据,若是咱们在Controller层经过@ResponseBody
将返回数据自动转换成json时,不作任何处理,而直接传给前端的话,在Long长度大于17位时会出现精度丢失的问题。前端
@responseBody
注解的做用是将controller的方法返回的对象经过适当的转换器(默认使用MappingJackson2HttpMessageConverte
转换为指定的格式以后,写入到response对象的body区,须要注意的是,在使用此注解以后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于经过response对象输出指定格式的数据,做用等同于 response.getWriter.write(JSONObject.fromObject(user).toString())
;java
总的来讲主要有两种处理方式,最经常使用的办法就是待转化的字段统一转成String类型web
通常有两种方式:首先咱们要在maven中添加必须的依赖spring
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>版本号</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>版本号</version> </dependency>
在待转化的字段之上加上@JsonSerialize(using=ToStringSerializer.class)注解,如图所示:json
@JsonInclude(JsonInclude.Include.NON_NULL) public class ProductVo { @JsonSerialize(using=ToStringSerializer.class) private Long productId private String productName; get,set省略
在webconfig配置中加入自定义配置消息转换器configureMessageConverters
,app
@Component class WebConfigurer extends WebMvcConfigurationSupport { /** * 序列换成json时,将全部的long变成string * 由于js中得数字类型不能包含全部的java long值 */ public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = new ObjectMapper(); SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); objectMapper.registerModule(simpleModule); jackson2HttpMessageConverter.setObjectMapper(objectMapper); converters.add(jackson2HttpMessageConverter); } }