升級后,運行顯示項目的時候出現下面錯誤
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如下:
package org.jeecg.config;import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import io.micrometer.prometheus.PrometheusMeterRegistry;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.boot.actuate.trace.http.InMemoryHttpTraceRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;/*** Spring Boot 2.0 解決跨域問題** @Author qinfeng**/
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {@Value("${jeecg.path.upload}")private String upLoadPath;@Value("${jeecg.path.webapp}")private String webAppPath;@Value("${spring.resource.static-locations}")private String staticLocations;@Autowired(required = false)private PrometheusMeterRegistry prometheusMeterRegistry;/*** 靜態資源的配置 - 使得可以從磁盤中讀取 Html、圖片、視頻、音頻等*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**")//update-begin-author:taoyan date:20211116 for: jeecg.path.webapp配置無效 #3126.addResourceLocations("file:" + upLoadPath + "//").addResourceLocations("file:" + webAppPath + "//")//update-end-author:taoyan date:20211116 for: jeecg.path.webapp配置無效 #3126.addResourceLocations(staticLocations.split(","));}/*** 方案一: 默認訪問根路徑跳轉 doc.html頁面 (swagger文檔頁面)* 方案二: 訪問根路徑改成跳轉 index.html頁面 (簡化部署方案: 可以把前端打包直接放到項目的 webapp,上面的配置)*/@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("doc.html");}@Bean@Conditional(CorsFilterCondition.class)public CorsFilter corsFilter() {final UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();final CorsConfiguration corsConfiguration = new CorsConfiguration();//是否允許請求帶有驗證信息corsConfiguration.setAllowCredentials(true);// 允許訪問的客戶端域名corsConfiguration.addAllowedOriginPattern("*");// 允許服務端訪問的客戶端請求頭corsConfiguration.addAllowedHeader("*");// 允許訪問的方法名,GET POST等corsConfiguration.addAllowedMethod("*");urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);return new CorsFilter(urlBasedCorsConfigurationSource);}/*** 添加Long轉json精度丟失的配置,同時改造日期josn解析出錯問題* @Return: void*/@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(objectMapper());converters.add(jackson2HttpMessageConverter);}/*** 自定義ObjectMapper*/@Bean@Primarypublic ObjectMapper objectMapper() {ObjectMapper objectMapper = new ObjectMapper();//處理bigDecimalobjectMapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);objectMapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS);//處理失敗objectMapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);objectMapper.configure(DeserializationFeature.FAIL_ON_NULL_CREATOR_PROPERTIES, false);//默認的處理日期時間格式objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));JavaTimeModule javaTimeModule = new JavaTimeModule();javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));objectMapper.registerModule(javaTimeModule);return objectMapper;}/*** SpringBootAdmin的Httptrace不見了* https://blog.csdn.net/u013810234/article/details/110097201*/@Beanpublic InMemoryHttpTraceRepository getInMemoryHttpTrace(){return new InMemoryHttpTraceRepository();}/*** 解決springboot2.6* 日期時間格式化* @return*//*@Beanpublic Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {return builder -> {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//返回時間數據序列化builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(formatter));//接收時間數據反序列化builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));};}*//*** 解決springboot2.6* 解決metrics端點不顯示jvm信息的問題(zyf)*/@BeanInitializingBean forcePrometheusPostProcessor(BeanPostProcessor meterRegistryPostProcessor) {return () -> meterRegistryPostProcessor.postProcessAfterInitialization(prometheusMeterRegistry, "");}}
parseDictText部分修改如下:
private void parseDictText(Object result) {if (result instanceof Result) {if (((Result) result).getResult() instanceof IPage) {List<JSONObject> items = new ArrayList<>();//step.1 篩選出加了 Dict 注解的字段列表List<Field> dictFieldList = new ArrayList<>();// 字典數據列表, key = 字典code,value=數據列表Map<String, List<String>> dataListMap = new HashMap<>();for (Object record : ((IPage) ((Result) result).getResult()).getRecords()) {ObjectMapper mapper = new ObjectMapper();String json="{}";try {//解決@JsonFormat注解解析不了的問題詳見SysAnnouncement類的@JsonFormat//json = mapper.writeValueAsString(record); //改用objectMapper,解決java8 LocalDateTime JSON解析問題json = objectMapper.writeValueAsString(record);} catch (JsonProcessingException e) {log.error("json解析失敗"+e.getMessage(),e);}JSONObject item = JSONObject.parseObject(json);//update-begin--Author:scott -- Date:20190603 ----for:解決繼承實體字段無法翻譯問題------//for (Field field : record.getClass().getDeclaredFields()) {// 遍歷所有字段,把字典Code取出來,放到 map 里for (Field field : oConvertUtils.getAllFields(record)) {String value = item.getString(field.getName());if (oConvertUtils.isEmpty(value)) {continue;}//update-end--Author:scott -- Date:20190603 ----for:解決繼承實體字段無法翻譯問題------if (field.getAnnotation(Dict.class) != null) {if (!dictFieldList.contains(field)) {dictFieldList.add(field);}String code = field.getAnnotation(Dict.class).dicCode();String text = field.getAnnotation(Dict.class).dicText();String table = field.getAnnotation(Dict.class).dictTable();List<String> dataList;String dictCode = code;if (!StringUtils.isEmpty(table)) {dictCode = String.format("%s,%s,%s", table, text, code);}dataList = dataListMap.computeIfAbsent(dictCode, k -> new ArrayList<>());this.listAddAllDeduplicate(dataList, Arrays.asList(value.split(",")));}//date類型默認轉換string格式化日期if (field.getType().getName().equals("java.util.Date")&&field.getAnnotation(JsonFormat.class)==null&&item.get(field.getName())!=null){SimpleDateFormat aDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));}}items.add(item);}//step.2 調用翻譯方法,一次性翻譯Map<String, List<DictModel>> translText = this.translateAllDict(dataListMap);//step.3 將翻譯結果填充到返回結果里for (JSONObject record : items) {for (Field field : dictFieldList) {String code = field.getAnnotation(Dict.class).dicCode();String text = field.getAnnotation(Dict.class).dicText();String table = field.getAnnotation(Dict.class).dictTable();String fieldDictCode = code;if (!StringUtils.isEmpty(table)) {fieldDictCode = String.format("%s,%s,%s", table, text, code);}String value = record.getString(field.getName());if (oConvertUtils.isNotEmpty(value)) {List<DictModel> dictModels = translText.get(fieldDictCode);if(dictModels==null || dictModels.size()==0){continue;}String textValue = this.translDictText(dictModels, value);log.debug(" 字典Val : " + textValue);log.debug(" __翻譯字典字段__ " + field.getName() + CommonConstant.DICT_TEXT_SUFFIX + ": " + textValue);// TODO-sun 測試輸出,待刪log.debug(" ---- dictCode: " + fieldDictCode);log.debug(" ---- value: " + value);log.debug(" ----- text: " + textValue);log.debug(" ---- dictModels: " + JSON.toJSONString(dictModels));record.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue);}}}((IPage) ((Result) result).getResult()).setRecords(items);}}}
這樣就解決了上面開頭標題的問題。