Entity转换带swagger注解的DTO

MyBatisPlus Generator (MPG) 主要用于自动生成MyBatis的Mapper、Entity、Service以及Mapper XML文件等,不能自动生成DTO,虽然可以通过模板写,但是比较麻烦。

所以自己写了一个entity转dto的工具类,只要通过已经生成的entity就可以直接生成DTO文件了。

使用:

在main方法中输入源entity的路径、类的注解、输出路径(如果为空,则使用源entity路径)。

有用请点赞收藏 !

package com.utils;

import com.github.javaparser.StaticJavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.body.FieldDeclaration;
import com.github.javaparser.ast.comments.JavadocComment;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import org.apache.commons.lang3.StringUtils;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Optional;

/**
 * @description 转换实体类为DTO类
 * @author :jixing2000
 */
public class TransToDTOUtil {
    /*
    需要导入pom.xml
    <!-- JavaParser -->
        <dependency>
            <groupId>com.github.javaparser</groupId>
            <artifactId>javaparser-symbol-solver-core</artifactId>
            <version>3.23.1</version> <!-- 请检查最新版本并替换 -->
        </dependency>
        <dependency>
            <groupId>com.github.javaparser</groupId>
            <artifactId>javaparser-core</artifactId>
            <version>3.23.1</version> <!-- 请检查最新版本并替换 -->
        </dependency>
     */

    public static void main(String[] args) {
        new TransToDTOUtil().doTrans("src/main/java/com/basis/entity/SysLogEntity.java","日志表","src/main/java/com/dto/");
    }

    /**
     * 转换实体类为DTO类
     * @param entityFilePath Entity类的文件路径
     * @param title 类注释
     * @param outPath DTO类的输出路径,非必填
     */
    private void doTrans(String entityFilePath,String title,String outPath){
        try {
            File entityFile = new File(entityFilePath);
            // 解析Entity类文件
            CompilationUnit cu = StaticJavaParser.parse(entityFile);
            // DTO类的包名与Entity相同
            String packageName = "";
            // 输出DTO类的文件路径,与Entity同目录
            String dtoFilePath = "";
            String realPathArr[] = entityFilePath.split("/");
            String outPathArr[] = outPath.split("/");
            for(int i =3;i<outPathArr.length;i++){
                packageName += "."+outPathArr[i];
            }
            packageName = packageName.substring(1);
            String entityNameAndSuffix = realPathArr[realPathArr.length-1];
            entityNameAndSuffix = entityNameAndSuffix.replace("Entity.java", "DTO.java");
            String className = entityNameAndSuffix.substring(0, entityNameAndSuffix.length()-5);
            if(StringUtils.isNotEmpty(outPath)){
                dtoFilePath = outPath+className+".java";
            }
            else{
                dtoFilePath = entityFilePath.replace("Entity.java", "DTO.java");
            }
            File dtoFile = new File(dtoFilePath);

            try (FileWriter writer = new FileWriter(dtoFile)) {
                writer.write("package " + packageName + ";\n\n");
                writer.write("import io.swagger.annotations.ApiModel;\n");
                writer.write("import io.swagger.annotations.ApiModelProperty;\n");
                writer.write("import lombok.Data;\n");
                writer.write("import java.util.Date;\n");
                title = title+" "+className;
                writer.write("@ApiModel(value = \""+title+"\")\n");
                writer.write("@Data\n");
                writer.write("public class "+className+" {\n");

                // 遍历字段,提取注释并生成DTO属性
                new VoidVisitorAdapter<Void>() {
                    @Override
                    public void visit(FieldDeclaration fd, Void arg) {
                        super.visit(fd, arg);
                        Optional<JavadocComment> javadoc = fd.getJavadocComment();
                        javadoc.ifPresent(comment -> {
                            String commentContent = comment.getContent().toString().trim();
                            commentContent = commentContent.replace("*","");
                            commentContent = commentContent.replace("\n","");
                            commentContent = commentContent.replace("\r","");
                            commentContent = commentContent.replace("\r\n","");
                            commentContent = commentContent.replace(" ","");
                            String propName = fd.getVariable(0).getNameAsString();
                            try {
                                writer.write("\t@ApiModelProperty(value = \"" + commentContent + "\")\n");
                                writer.write("\tprivate " + fd.getVariable(0).getTypeAsString() + " " + propName + ";\n\n");
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        });
                    }
                }.visit(cu, null);

                writer.write("}\n");
                System.out.println("DTO class generated successfully at: " + dtoFilePath);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在软件开发中,数据传输对象(DTO)和实体对象(Entity)通常具有不同的属性和用途,因此在应用程序中进行它们之间的转换是很常见的。 一种常用的转换方法是手动编写转换代码,但这种方法可能会导致大量重复的代码和繁琐的工作。另一种方法是使用自动化转换工具,例如MapStruct、ModelMapper等,这些工具可以生成转换代码,从而减少了手动编写的工作量。 下面是一个使用MapStruct进行DTOEntity转换的示例: 首先,在pom.xml文件中添加MapStruct依赖: ``` <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>1.4.2.Final</version> </dependency> ``` 然后,定义DTOEntity: ``` public class UserDTO { private Long id; private String username; private String email; // getter和setter方法 } public class UserEntity { private Long id; private String username; private String email; // getter和setter方法 } ``` 接下来,创建转换器接口并使用@Mapper注解标记它: ``` @Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); UserDTO toDto(UserEntity entity); UserEntity toEntity(UserDTO dto); } ``` 最后,在应用程序中使用转换器进行DTOEntity之间的转换: ``` UserDTO dto = UserMapper.INSTANCE.toDto(entity); UserEntity entity = UserMapper.INSTANCE.toEntity(dto); ``` 使用MapStruct可以简化DTOEntity之间的转换,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值