【JAVA日常】关于jeecgBoot @Dict注解的使用不生效问题

这篇具有很好参考价值的文章主要介绍了【JAVA日常】关于jeecgBoot @Dict注解的使用不生效问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目中后端使用jeecgBoot开发,最近正好遇到一些关于改造和使用@dict字典注解的问题,正好记录一下,以防忘记。

1、注解不生效问题1

今天公司同事问,说这个注解加上了怎么还不起作用呢。
我们就检查了代码中的使用。注解的添加以及使用都正常,然后排查发现接口调用时未执行字典的切面,那么问题基本就清晰了,检查了Dict注解的切点

public * org.jeecg.modules..*.*Controller.*(..))"

而在他的实际代码中,他的controller层的命名为 *ControllerApp,问题就出在这里了。

解决办法有两个要么同事代码的命名来进行修改切点配置,要么就遵循jeecgBoot框架的切点配置。

2、注解切面处理字典只兼容IPage

这个问题吧,也不算是问题,就是在使用@Dict注解的过程中 总会遇到一些时候我们并不需要返回IPage,但是又想进行字典翻译的情况。
但是翻看了官方的切面代码

(代码位置:org/jeecg/modules/system/aspect/DictAspect.java)

发现官方仅支持当Result的返回类型为IPage时才进行处理,并不适用于我们需要的Map、List、对象、Json类型。
jeecgboot数据字典不生效,java,windows,开发语言

只好对该切面进行改造。
注意:该方法并不适用所有,谨慎使用。
下面来讲一下改造方法:
在上图中的if方法后 增加一个else方法,放入下方代码

else if (!(((Result)result).getResult() instanceof String)){
                /**
                 * 2023-07-18处理  @Dict注解增加支持 LIST、MAP、实体对象的字典翻译
                 * sansui
                 */
                //取出结果集
                Object object=  (Object) ((Result) result).getResult();
                if(oConvertUtils.isEmpty(object)){
                    return result;
                }
                Class<?> aClass = ((Result) result).getResult().getClass();
                if ("java.util.HashMap".equals(aClass.getName())){
                    //将map转换为集合在转换为map
                    Map<String, Object> mapset = new HashMap<>();
                    Map<String,Object> map=  (Map<String,Object>) object;
                    for (String s : map.keySet()) {
                        Object a1 = map.get(s);
                        List<Object> records=new ArrayList<>();
                        Class<?> aClass1 = a1.getClass();
                        if ("java.util.ArrayList".equals(aClass1.getName())){
                            records = (ArrayList)map.get(s);
                        }else{
                            records = oConvertUtils.objToList(a1, Object.class);
                        }
                        Boolean hasDict= checkHasDict(records);
                        if(!hasDict){
                            return result;
                        }
                        List<JSONObject> dictText = getDictText(records);
                        mapset.put(s,dictText);
                    }
                    ((Result) result).setResult(mapset);
                }else if (((Result)result).getResult() instanceof List){
                    List<Object> records = oConvertUtils.objToList(object, Object.class);
                    //判断是否含有字典注解,没有注解返回-----
                    Boolean hasDict= checkHasDict(records);
                    if(!hasDict){
                        return result;
                    }
                    List<JSONObject> dictText = getDictText(records);
                    ((Result) result).setResult(dictText);
                }else {
                    // 取出结果
                    Object record = ((Result)result).getResult();

                    if (record instanceof Boolean) {
                        // record是布尔类型
                        // 进行相应的操作
                        return result;
                    }

                    log.debug(" __ 进入字典翻译切面 DictAspect —— ");
                    // update-end--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 判断是否含有字典注解,没有注解返回-----
                    String json = "{}";
                    try {
                        // 解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat
                        json = objectMapper.writeValueAsString(record);
                    } catch (JsonProcessingException e) {
                        log.error("json解析失败" + e.getMessage(), e);
                    }
                    JSONObject item = JSONObject.parseObject(json, Feature.OrderedField);
                    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) {
                            String code = field.getAnnotation(Dict.class).dicCode();
                            String text = field.getAnnotation(Dict.class).dicText();
                            String table = field.getAnnotation(Dict.class).dictTable();
                            String key = String.valueOf(item.get(field.getName()));

                            String fieldDictCode = code;
                            if (!org.apache.commons.lang.StringUtils.isEmpty(table)) {
                                fieldDictCode = String.format("%s,%s,%s", table, text, code);
                            }

                            String textValue = this.translateDictValue(code, text, table,key);
                            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);

                            item.put(field.getName() + CommonConstant.DICT_TEXT_SUFFIX, textValue);
                        }
                    }
                    ((Result)result).setResult(item);
                }
            } 

其中 使用到了一个 新增方法,当前类 随便找个地方放一下就行。

/**
     传入集合 翻译字典值
     **/
    private List<JSONObject> getDictText(List<Object> records){
        List<JSONObject> items = new ArrayList<>();
        //step.1 筛选出加了 Dict 注解的字段列表
        List<Field> dictFieldList = new ArrayList<>();
        // 字典数据列表, key = 字典code,value=数据列表
        Map<String, List<String>> dataListMap = new HashMap<>(5);


        log.debug(" __ 进入字典翻译切面 DictAspect —— " );
        //update-end--Author:zyf -- Date:20220606 ----for:【VUEN-1230】 判断是否含有字典注解,没有注解返回-----
        for (Object record : records) {
            String json="{}";
            try {
                //update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
                //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat
                json = objectMapper.writeValueAsString(record);
                //update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
            } catch (JsonProcessingException e) {
                log.error("json解析失败"+e.getMessage(),e);
            }
            //update-begin--Author:scott -- Date:20211223 ----for:【issues/3303】restcontroller返回json数据后key顺序错乱 -----
            JSONObject item = JSONObject.parseObject(json, Feature.OrderedField);
            //update-end--Author:scott -- Date:20211223 ----for:【issues/3303】restcontroller返回json数据后key顺序错乱 -----

            //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格式化日期
                //update-begin--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
                //if (JAVA_UTIL_DATE.equals(field.getType().getName())&&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()))));
                //}
                //update-end--Author:zyf -- Date:20220531 ----for:【issues/#3629】 DictAspect Jackson序列化报错-----
            }
            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);
                }
            }
        }
        return items;
    }

欧克,在测试就支持实体对象进行翻译了。文章来源地址https://www.toymoban.com/news/detail-781490.html

到了这里,关于【JAVA日常】关于jeecgBoot @Dict注解的使用不生效问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 日常BUG——SpringBoot关于父子工程依赖问题

    😜 作           者 :是江迪呀 ✒️ 本文 : 日常BUG 、 BUG 、 问题分析 ☀️ 每日   一言 : 存在错误说明你在进步! 在父子工程A和B中。A依赖于B,但是A中却无法引入B中的依赖,具体出现的状况如下: config工程依赖于core工程,但是在依赖都引入的情况下,con

    2024年02月12日
    浏览(45)
  • 关于在 springboot 中使用 @Autowired 注解来对 TemplateEngine 进行自动装配时,无法注入的问题。

    本文是基于江南一点雨的 Spring Boot+Vue 系列视频教程第 三 章的第三节,详情参考Spring Boot+Vue系列视频教程 在观看学习这一节时,发现当进行手动渲染 Thymeleaf 模板时,通过 @Autowired 注解来对 TemplateEngine 进行自动装配时,发现 idea 对其显示 No beans of \\\'TemplateEngine \\\' type of found。

    2024年02月02日
    浏览(49)
  • 关于uview小程序表单校验不生效问题,以及小程序自定义校验

    Form 表单 | uView - 多平台快速开发的UI框架 - uni-app UI框架 官网例子 编写完了之后发现正则这块不生效 是因为不兼容,如果需要兼容小程序 需要加上 即可解决 如果校验还没生效请检查标签是否填入必要的属性

    2024年02月06日
    浏览(49)
  • 关于Java注解的一些理解 小结

    目录 1. 常用注解和理解 2. 自定义注解 2.1 案例背景 2.2 设计思路 3 总结 注解在我的理解下,就是代码中的特殊标记,这些标记可以在 编译、类加载、运行时 被读取,并执行相对应的处理。 可能有些抽象,简单来说注解其实在开发中是非常常见的,比如我们在使用各种框架时

    2023年04月23日
    浏览(42)
  • java中,如何解决@NotBlank不生效的问题 @NotBlank @NotEmpty不生效,以及对象嵌套问题...

    这篇文章主要介绍了如何解决@NotBlank不生效的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。 1.解决@NotBlank不生效 最近做一个新项目,写新接口时发现@NotBlank @NotEmpty不生效,@NotNull则生效,令人费解。仔细检查一下2步骤 用法

    2024年02月11日
    浏览(39)
  • 关于Unity使用Aspose.Words创建表格单元格垂直合并不生效情况说明

    👉一、前言 最近在使用Aspose.Words.dll实现创建表格功能时,遇到了一个让我费解了好几天的问题——单元格垂直合并失效。我都快要怀疑人生了都,关键是它水平合并没问题,而且创建别的表格垂直合并也没问题;况且经过我反复测试,代码逻辑也是没有问题的,你说这气不

    2023年04月11日
    浏览(54)
  • 日常踩坑:Java中double类型出现科学计数法问题

    背景:在与银行的项目对接中,近期客户反馈支付失败,错误信息是:“付款金额格式有问题”,经过日志分析,发现客户系统发送银行系统时,付款金额以科学计数法的形式传递参数。 重现: 经过测试发现,浮点数(double、float)当整数部分超过7位以上(不含7位),就会

    2024年02月16日
    浏览(45)
  • @Transactional注解作用,不生效的场景,事务回滚

    声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。 简而言之,@Transactional注解在代码执行出错的时候能够进行事务的回滚。 在启动类上添加@EnableTransac

    2024年02月10日
    浏览(49)
  • Java POI (3)—— Excel单元格复制过程中公式不生效的问题

    在实现Excel中单元格的复制功能实现上,之前的代码是这样写的 这样写在进行大部分数据类型复制的过程的都没有问题,但除了公式类型的数据不能成功复制,网上有一些博主的做法是直接将 复制到公式的类型下,当然这样也可以成功的将源单元格中的数据复制过来,而且复

    2024年02月12日
    浏览(51)
  • Java中indexOf() 方法 总计及其日常使用

    博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客👦🏻 《java 面试题大全》 🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭 《MYSQL从入门到精通》数据库是开发者必会基础之一~ 🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄

    2023年04月25日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包