nbcio-boot が springboot、mybatis-plus、および JSQLParser をアップグレードした後の LocalDateTime 日付 JSON の問題

アップグレード後、表示プロジェクトを実行すると次のエラーが発生します

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 日付/時刻型 `java.time.LocalDateTime` はデフォルトではサポートされていません: モジュール "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" を追加して処理を有効にします (参照チェーン経由: java.util.HashMap["create_time) "])
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 日付/時刻型 `java.time.LocalDateTime` はデフォルトではサポートされていません: モジュール "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" を追加します
    com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) での処理 (参照チェーン: java.util.HashMap["create_time"] 経由) を有効にします。
    com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300)
    com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35)
    com.fasterxml.jackson.databind .ser.std.MapSerializer.serializeFields(MapSerializer.java:808)
    com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeWithoutTypeInfo(MapSerializer.java:764)
    com.fasterxml.jackson.databind.ser.std .MapSerializer.serialize(MapSerializer.java:720)
    com.fasterxml.jackson.databind.ser.std.MapSerializer.serialize(MapSerializer.java:35)
    com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider) .java:480)
    com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
    で com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4568) で
    com.fasterxml.jackson.databind.ObjectMapper org.jeecg.common.aspect.DictAspect.parseDictText( DictAspect.java:102
    ) の
    org.jeecg.common.aspect.DictAspect.doAround(DictAspect.java:59)の
    jdk で。 Internal.reflect.GeneratedMethodAccessor186.invoke(不明なソース)
    java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.base/java.lang.reflect.Method.invoke(Method.java) :568)
    org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
    で org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)
    で org.springframework.aop.aspec tj.AspectJAroundAdvice.invoke (AspectJAroundAdvice.java:72)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    で org. springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89)
    org.jeecg.common.aspect.AutoLogAspect.around(AutoLogAspect.java:57)
    jdk.internal.reflect.GeneratedMethodAccessor246.invoke(不明なソース)
    で java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    で java.base/java.lang.reflect.Method.invoke( Method.java:568)
    org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634)
    org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624)
    org.springフレームワーク.aop .aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72)
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175)
    org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763) で
    org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
    で org.springframework.aop.framework.ReflectiveMethodInvocationで.proceed(ReflectiveMethodInvocation.java:186)
    org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708) )
    com.nbcio.modules.estar.tw.controller.TwProjectController$$EnhancerBySpringCGLIB$$894db4b8.querySelfList(<生成>)
    java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    で java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) で
    java.base/jdk.internal.reflect。 DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    java.base/java.lang.reflect.Method.invoke(Method.java:568)
    org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java: 205)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
    で org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) で
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) で
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)で
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    で org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072)
    で org.springframework.web.servlet
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) の.DispatcherServlet.doService(DispatcherServlet.java:965 )
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
    で javax.servlet.http.HttpServlet.service(HttpServlet.java:528)
    で org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet) .java:883)
    、javax.servlet.http.HttpServlet.service(HttpServlet.java:596)
    、org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209)
    、org.apache.catalina.core。 ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    で org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
    で org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:117)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    com.alibaba。 druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:124)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)
    org.springframework.web org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178 )
    の org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    の .filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) )
    org.apache.hiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
    で org.apache.hiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    org.apache.hiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    org.apache.hiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    org.apache.hiro.web .servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    org.apache.hiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.hiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter) .java:137)
    org.apache.hiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    で org.apache.hiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) で
    org. apache.hiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)
    org.apache.hiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)
    org.apache.hiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    org.apache.hiro で。 subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at org.apache.hiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
    at org.apache.hiro.web.servlet.AbstractShiroFilter.doFilterInternal( AbstractShiroFilter.java:370)
    org.apache.hiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    アット org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) で
    org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) で
    org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:117)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    org.springframework で。 web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178)
    で org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    で org.springframework.boot.actuate.metrics.web .servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) )
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153)
    で org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
    で org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) で
    org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:153)
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
    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)
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
    で org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) で
    org.apache.coyote.http11.Http11Processor.service (Http11Processor.java:389)
    org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
    org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926)
    org.apache.tomcat で。
    org.apache.tomcat.util.threads.ThreadPoolExecutor の org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) のutil.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791)
    。 runWorker(ThreadPoolExecutor.java:1191)
    org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
    で org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)で
    java.base /java.lang.Thread.run(Thread.java:833)

上記のヒントを参照すると、主な問題は次のとおりです。

org.jeecg.common.aspect.DictAspect.parseDictText(DictAspect.java:102)
    で 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、图片、视频、音频等
     */
    @Override
    public 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,上面的配置)
     */
    @Override
    public 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
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(objectMapper());
        converters.add(jackson2HttpMessageConverter);
    }

    /**
     * 自定义ObjectMapper
     */
    @Bean
    @Primary
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        //处理bigDecimal
        objectMapper.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
     */
    @Bean
    public InMemoryHttpTraceRepository getInMemoryHttpTrace(){
        return new InMemoryHttpTraceRepository();
    }
    
    /**
     * 解决springboot2.6
     * 日期时间格式化
     * @return
     */
    /*@Bean
    public 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)
     */
    @Bean
    InitializingBean 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);
            }

        }
    }

これにより、上記のオープニング タイトルの問題が解決されます。

おすすめ

転載: blog.csdn.net/qq_40032778/article/details/132250620