前端後接口對接時,如果後臺的id或者其他字段使用了長整型Long,就很容易出現js丟失精度問題。用接口工具調用時,往往id返回都是對的,但是一到頁面上,js就後綴000。
前端說返回的值有問題,F12看看!後端說沒問題,Postman看看!
這是js支持的問題,解決這個問題的辦法很顯然,返回字符串即可。
怎麼實現呢,你可以直接將vo對象的id改成String類型,但是會帶來copyProperties的不便,所以見過很多人通過增加虛擬字段實現。下面是一個整體解決方案:(需要略微瞭解下Spring的消息序列化原理,譬如MappingJackson2HttpMessageConverter是幹嘛的)
-
MainConfig(通常是主config類,@Configuration註解的,用來導入一些基礎配置)增加MessageConvert的重寫extendMessageConverters:
@Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jacksonConverter = null; for (HttpMessageConverter<?> converter : converters) { if (converter instanceof MappingJackson2HttpMessageConverter) { jacksonConverter = (MappingJackson2HttpMessageConverter) converter; } } if (jacksonConverter != null) { jacksonConverter.setObjectMapper(new CustomObjectMapper()); converters.add(jacksonConverter); } }
- CustomObjectMapper的實現:
public class CustomObjectMapper extends ObjectMapper { public CustomObjectMapper() { super(); SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); registerModule(simpleModule); } }
這樣,接口返回的時候,所有的長整型字段,會被當做字符串處理,自動加上雙引號。