当前位置:   article > 正文

nbcio-boot升级springboot、mybatis-plus和JSQLParser后的LocalDateTime日期json问题_mybatisplus json字段 localdatetime

mybatisplus json字段 localdatetime

升级后,运行显示项目的时候出现下面错误

2023-08-12 10:57:39.174 [http-nio-8080-exec-3] [1;31mERROR[0;39m [36morg.jeecg.common.aspect.DictAspect:104[0;39m - json解析失败Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: java.util.HashMap["create_time"])
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: java.util.HashMap["create_time"])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300)
    at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35)
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:808)
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:764)
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:720)
    at com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:35)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
    at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4568)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3821)
    at org.jeecg.common.aspect.DictAspect.parseDictText(DictAspect.java:102)
    at org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:59)
    at jdk.internal.reflect.GeneratedMethodAccessor186.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
    at org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:57)
    at jdk.internal.reflect.GeneratedMethodAccessor246.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)
    at com.nbcio.modules.estar.tw.controller.TwProjectController

EnhancerBySpringCGLIB
894db4b8.querySelfList(<generated>)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:528)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:596)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:492)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:389)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
    at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:833)

看上面提示主要应该是下面的问题

at org.jeecg.common.aspect.DictAspect.parseDictText(DictAspect.java:102)
    at org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:59)

原因是没有处理joda-time类型的时间日期,修改WebMvcConfiguration如下:

  1. package org.jeecg.config;
  2. import com.fasterxml.jackson.core.JsonGenerator;
  3. import com.fasterxml.jackson.databind.DeserializationFeature;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
  6. import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
  7. import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
  8. import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
  9. import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
  10. import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
  11. import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
  12. import io.micrometer.prometheus.PrometheusMeterRegistry;
  13. import org.springframework.beans.factory.InitializingBean;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Value;
  16. import org.springframework.beans.factory.config.BeanPostProcessor;
  17. import org.springframework.boot.actuate.trace.http.InMemoryHttpTraceRepository;
  18. import org.springframework.context.annotation.Bean;
  19. import org.springframework.context.annotation.Conditional;
  20. import org.springframework.context.annotation.Configuration;
  21. import org.springframework.context.annotation.Primary;
  22. import org.springframework.http.converter.HttpMessageConverter;
  23. import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
  24. import org.springframework.web.cors.CorsConfiguration;
  25. import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
  26. import org.springframework.web.filter.CorsFilter;
  27. import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
  28. import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
  29. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  30. import java.text.SimpleDateFormat;
  31. import java.time.LocalDate;
  32. import java.time.LocalDateTime;
  33. import java.time.LocalTime;
  34. import java.time.format.DateTimeFormatter;
  35. import java.util.List;
  36. /**
  37. * Spring Boot 2.0 解决跨域问题
  38. *
  39. * @Author qinfeng
  40. *
  41. */
  42. @Configuration
  43. public class WebMvcConfiguration implements WebMvcConfigurer {
  44. @Value("${jeecg.path.upload}")
  45. private String upLoadPath;
  46. @Value("${jeecg.path.webapp}")
  47. private String webAppPath;
  48. @Value("${spring.resource.static-locations}")
  49. private String staticLocations;
  50. @Autowired(required = false)
  51. private PrometheusMeterRegistry prometheusMeterRegistry;
  52. /**
  53. * 静态资源的配置 - 使得可以从磁盘中读取 Html、图片、视频、音频等
  54. */
  55. @Override
  56. public void addResourceHandlers(ResourceHandlerRegistry registry) {
  57. registry.addResourceHandler("/**")
  58. //update-begin-author:taoyan date:20211116 for: jeecg.path.webapp配置无效 #3126
  59. .addResourceLocations("file:" + upLoadPath + "//")
  60. .addResourceLocations("file:" + webAppPath + "//")
  61. //update-end-author:taoyan date:20211116 for: jeecg.path.webapp配置无效 #3126
  62. .addResourceLocations(staticLocations.split(","));
  63. }
  64. /**
  65. * 方案一: 默认访问根路径跳转 doc.html页面 (swagger文档页面)
  66. * 方案二: 访问根路径改成跳转 index.html页面 (简化部署方案: 可以把前端打包直接放到项目的 webapp,上面的配置)
  67. */
  68. @Override
  69. public void addViewControllers(ViewControllerRegistry registry) {
  70. registry.addViewController("/").setViewName("doc.html");
  71. }
  72. @Bean
  73. @Conditional(CorsFilterCondition.class)
  74. public CorsFilter corsFilter() {
  75. final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
  76. final CorsConfiguration corsConfiguration = new CorsConfiguration();
  77. //是否允许请求带有验证信息
  78. corsConfiguration.setAllowCredentials(true);
  79. // 允许访问的客户端域名
  80. corsConfiguration.addAllowedOriginPattern("*");
  81. // 允许服务端访问的客户端请求头
  82. corsConfiguration.addAllowedHeader("*");
  83. // 允许访问的方法名,GET POST等
  84. corsConfiguration.addAllowedMethod("*");
  85. urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
  86. return new CorsFilter(urlBasedCorsConfigurationSource);
  87. }
  88. /**
  89. * 添加Long转json精度丢失的配置,同时改造日期josn解析出错问题
  90. * @Return: void
  91. */
  92. @Override
  93. public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  94. MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(objectMapper());
  95. converters.add(jackson2HttpMessageConverter);
  96. }
  97. /**
  98. * 自定义ObjectMapper
  99. */
  100. @Bean
  101. @Primary
  102. public ObjectMapper objectMapper() {
  103. ObjectMapper objectMapper = new ObjectMapper();
  104. //处理bigDecimal
  105. objectMapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
  106. objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);
  107. //处理失败
  108. objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);
  109. objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  110. objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
  111. objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_CREATOR_PROPERTIES, false);
  112. //默认的处理日期时间格式
  113. objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
  114. JavaTimeModule javaTimeModule = new JavaTimeModule();
  115. javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
  116. javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
  117. javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
  118. javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
  119. javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
  120. javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
  121. objectMapper.registerModule(javaTimeModule);
  122. return objectMapper;
  123. }
  124. /**
  125. * SpringBootAdmin的Httptrace不见了
  126. * https://blog.csdn.net/u013810234/article/details/110097201
  127. */
  128. @Bean
  129. public InMemoryHttpTraceRepository getInMemoryHttpTrace(){
  130. return new InMemoryHttpTraceRepository();
  131. }
  132. /**
  133. * 解决springboot2.6
  134. * 日期时间格式化
  135. * @return
  136. */
  137. /*@Bean
  138. public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
  139. return builder -> {
  140. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  141. //返回时间数据序列化
  142. builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
  143. //接收时间数据反序列化
  144. builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
  145. };
  146. }*/
  147. /**
  148. * 解决springboot2.6
  149. * 解决metrics端点不显示jvm信息的问题(zyf)
  150. */
  151. @Bean
  152. InitializingBean forcePrometheusPostProcessor(BeanPostProcessor meterRegistryPostProcessor) {
  153. return () -> meterRegistryPostProcessor.postProcessAfterInitialization(prometheusMeterRegistry, "");
  154. }
  155. }

parseDictText部分修改如下:

  1. private void parseDictText(Object result) {
  2. if (result instanceof Result) {
  3. if (((Result) result).getResult() instanceof IPage) {
  4. List<JSONObject> items = new ArrayList<>();
  5. //step.1 筛选出加了 Dict 注解的字段列表
  6. List<Field> dictFieldList = new ArrayList<>();
  7. // 字典数据列表, key = 字典code,value=数据列表
  8. Map<String, List<String>> dataListMap = new HashMap<>();
  9. for (Object record : ((IPage) ((Result) result).getResult()).getRecords()) {
  10. ObjectMapper mapper = new ObjectMapper();
  11. String json="{}";
  12. try {
  13. //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat
  14. //json = mapper.writeValueAsString(record); //改用objectMapper,解决java8 LocalDateTime JSON解析问题
  15. json = objectMapper.writeValueAsString(record);
  16. } catch (JsonProcessingException e) {
  17. log.error("json解析失败"+e.getMessage(),e);
  18. }
  19. JSONObject item = JSONObject.parseObject(json);
  20. //update-begin--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
  21. //for (Field field : record.getClass().getDeclaredFields()) {
  22. // 遍历所有字段,把字典Code取出来,放到 map 里
  23. for (Field field : oConvertUtils.getAllFields(record)) {
  24. String value = item.getString(field.getName());
  25. if (oConvertUtils.isEmpty(value)) {
  26. continue;
  27. }
  28. //update-end--Author:scott -- Date:20190603 ----for:解决继承实体字段无法翻译问题------
  29. if (field.getAnnotation(Dict.class) != null) {
  30. if (!dictFieldList.contains(field)) {
  31. dictFieldList.add(field);
  32. }
  33. String code = field.getAnnotation(Dict.class).dicCode();
  34. String text = field.getAnnotation(Dict.class).dicText();
  35. String table = field.getAnnotation(Dict.class).dictTable();
  36. List<String> dataList;
  37. String dictCode = code;
  38. if (!StringUtils.isEmpty(table)) {
  39. dictCode = String.format("%s,%s,%s", table, text, code);
  40. }
  41. dataList = dataListMap.computeIfAbsent(dictCode, k -> new ArrayList<>());
  42. this.listAddAllDeduplicate(dataList, Arrays.asList(value.split(",")));
  43. }
  44. //date类型默认转换string格式化日期
  45. if (field.getType().getName().equals("java.util.Date")&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){
  46. SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  47. item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));
  48. }
  49. }
  50. items.add(item);
  51. }
  52. //step.2 调用翻译方法,一次性翻译
  53. Map<String, List<DictModel>> translText = this.translateAllDict(dataListMap);
  54. //step.3 将翻译结果填充到返回结果里
  55. for (JSONObject record : items) {
  56. for (Field field : dictFieldList) {
  57. String code = field.getAnnotation(Dict.class).dicCode();
  58. String text = field.getAnnotation(Dict.class).dicText();
  59. String table = field.getAnnotation(Dict.class).dictTable();
  60. String fieldDictCode = code;
  61. if (!StringUtils.isEmpty(table)) {
  62. fieldDictCode = String.format("%s,%s,%s", table, text, code);
  63. }
  64. String value = record.getString(field.getName());
  65. if (oConvertUtils.isNotEmpty(value)) {
  66. List<DictModel> dictModels = translText.get(fieldDictCode);
  67. if(dictModels==null || dictModels.size()==0){
  68. continue;
  69. }
  70. String textValue = this.translDictText(dictModels, value);
  71. log.debug(" 字典Val : " + textValue);
  72. log.debug(" __翻译字典字段__ " + field.getName() + CommonConstant.DICT_TEXT_SUFFIX + ": " + textValue);
  73. // TODO-sun 测试输出,待删
  74. log.debug(" ---- dictCode: " + fieldDictCode);
  75. log.debug(" ---- value: " + value);
  76. log.debug(" ----- text: " + textValue);
  77. log.debug(" ---- dictModels: " + JSON.toJSONString(dictModels));
  78. record.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue);
  79. }
  80. }
  81. }
  82. ((IPage) ((Result) result).getResult()).setRecords(items);
  83. }
  84. }
  85. }

这样就解决了上面开头标题的问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/735087
推荐阅读
相关标签
  

闽ICP备14008679号