实体类转换DTO的方式

背景:在对外传输数据展示过程中,为了避免model层直接对外暴露,我们会多加一个对应的DTO保理想要传输的数据即可,隐藏model层。

应对:
1.第一种,如果是实体类字段类型都一样,大部分会采用bean拷贝的方式,BeanUtils.copyProperties(obj,obj),单个对象的转换还好,但是List对象就要循环来转换。

2.第二种,要是遇到驼峰类型字段与下划线字段的对象进行转换也是头疼,由于可能接口跟实体类不是一波人写的,在一致性上没用做统一的规范,导致model和DTO的字段类型还不一样。这种fastJson有对应的转换

/**
     * 将对象的大写转换为下划线加小写,例如:userName-->user_name
     *
     * tar 目标对象
     * to 转换对象
     * @return
     * @throws Exception
     */
    public static Object toUnderline(Object tar,Object to) throws Exception {
        SerializeConfig config = new SerializeConfig();
        config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
        String json=JSON.toJSONString(tar,config);
        return JSON.parseObject(json, to.getClass());
    }

SnakeCase 就是一种转换下划线的策略,当然也是可以互转的,只要修改策略的枚举值为CamelCase,就转为驼峰。

3.第三种,为了保持我们提供的接口代码尽量的简洁,当然不希望语句块中存在无关逻辑的转换实体类的语句,相对来说modelmapper提供了一个比较好的方式
pom依赖

<dependency>
    <groupId>org.modelmapper</groupId>
    <artifactId>modelmapper</artifactId>
    <version>${modelmapper.version}</version>
</dependency>
ModelMapper modelMapper = new ModelMapper();
//单个转换
ProductInfo productInfo = service.getOne();
ProductInfoDto dto = modelMapper.map(productInfo,ProductInfoDto.calss);

//list转换
 List<ProductInfo> productInfos =service.getList();
            List<ProductInfoDto> productInfoDtos = modelMapper.map(productInfos, new TypeToken<List<ProductInfoDto>>() {
            }.getType());
### 如何在 Swagger UI 中显示或配置实体类DTO 的详细信息 为了在 Swagger UI 中展示详细的实体类DTO 信息,可以通过以下方式实现: #### 1. 使用 `@ApiModelProperty` 注解修饰字段 通过为 DTO实体类中的字段添加 `@ApiModelProperty` 注解,可以定义这些字段的具体含义及其属性。这使得 Swagger UI 能够更清晰地呈现数据结构。 ```java import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @ApiModel(description = "用户对象模型") public class UserDto { @ApiModelProperty(value = "用户名", example = "JohnDoe", required = true) private String username; @ApiModelProperty(value = "密码", example = "password123", required = true) private String password; @ApiModelProperty(value = "年龄", example = "28", allowableValues = "range[0, 150]") private Integer age; // Getters and Setters } ``` 上述代码中,`@ApiModelProperty` 提供了多个选项来描述字段的用途、是否必填以及其他约束条件[^3]。 --- #### 2. 启用 XML 文档支持并加载注释文件 如果项目中有多个模块或者需要跨项目的文档支持,则需确保 Swagger 正确加载了对应的 XML 文件。XML 文件包含了编译期间生成的 JavaDoc 和其他注释信息。 以下是启用 XML 支持的示例代码: ```csharp using System.IO; using Microsoft.OpenApi.Models; services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); // 设置 XML 文件路径 var basePath = AppContext.BaseDirectory; var xmlPath = Path.Combine(basePath, "YourProjectName.xml"); c.IncludeXmlComments(xmlPath); }); ``` 此方法适用于 .NET Core 项目,在 Spring Boot 项目中则无需显式指定 XML 文件路径,因为默认会扫描所有带注解的类[^2]。 --- #### 3. 配置全局设置以增强 DTO 显示效果 除了单个字段级别的注解外,还可以利用 `@ApiModel` 来提供整个 DTO 类的整体说明。例如: ```java @ApiModel(description = "表示用户的传输对象,包含基本信息") public class UserDto { ... } ``` 此外,可以在控制器层面上使用 `@ApiOperation` 描述接口的功能,并结合 `@ApiParam` 定义请求参数的意义。 ```java @RestController @RequestMapping("/users") public class UserController { @ApiOperation(value = "创建新用户", notes = "根据传入的用户信息创建一个新的账户") public ResponseEntity<UserDto> createUser( @ApiParam(value = "新增用户所需的数据", required = true) @RequestBody AddUserParam param) { // 处理逻辑... } } ``` 以上代码片段展示了如何让开发者清楚了解每个操作的目的以及输入/输出的内容[^3]。 --- #### 4. 自定义序列化器优化复杂类型的展现形式 对于一些复杂的嵌套类型(如列表或其他自定义对象),可能还需要调整 JSON 序列化的规则以便更好地适配前端需求。此时可考虑引入 Jackson 的扩展功能来自定义格式转换过程。 ```json // 假设有一个包含地址集合的用户对象 { "username": "Alice", "addresses": [ {"city": "New York"}, {"city": "Los Angeles"} ] } ``` 通过编写特定的 Serializer/Derserializer 实现此类场景下的精确控制[^1]。 --- ### 总结 综上所述,要使 Swagger UI 展现出详尽的实体类DTO 数据详情,主要依赖于合理运用各种注解工具(如 `@ApiModelProperty`, `@ApiModel` 等)、激活必要的辅助资源(比如 XML 文档)以及必要时定制化处理流程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值