如何为ResponseDto添加令牌数据?附相关DTO定义与登录响应示例
问题:如何将令牌数据填充到登录响应DTO中?
已定义的相关代码
UserDto类
class UserDto{ Long id; String name; String email; String password; }
目标登录响应格式
{ "user":{ "id":"1", "name":"imesh" }, "token":{ "access_token":{ "token":"bhacvyusbi", "expired_at":"20200210" }, "refresh_token":{ "token":"bhacvyusbi", "expired_at":"20200210" } } }
已创建的响应DTO类
class ResponseDto{ UserDto user; // 注意:此处字段名应为token(与目标JSON的key对应),原reponse是笔误 AllTokenDto token; } class AllTokenDto{ TokenDto access_token; TokenDto refresh_token; } class TokenDto{ String token; Date expiredDate; }
已完成的用户数据映射代码
ResponseDto responseDto = new ResponseDto(); responseDto.setUser(modelMapper.map(userData, UserDto.class));
解决方案
1. 修正ResponseDto的字段名(关键)
原ResponseDto中的reponse字段名与目标JSON的tokenkey不匹配,会导致序列化后JSON结构错误,需先修正:
class ResponseDto{ UserDto user; AllTokenDto token; // 改为token,与目标JSON结构对齐 // 需补充对应的getter/setter方法 }
2. 构建并填充令牌数据
依次创建令牌实例、包装类,最终设置到ResponseDto中:
// 1. 构建access_token实例 TokenDto accessToken = new TokenDto(); accessToken.setToken("生成的access_token字符串"); // 替换为实际生成的令牌 accessToken.setExpiredDate(new Date(/* 令牌过期时间的Date对象 */)); // 2. 构建refresh_token实例 TokenDto refreshToken = new TokenDto(); refreshToken.setToken("生成的refresh_token字符串"); // 替换为实际生成的令牌 refreshToken.setExpiredDate(new Date(/* 令牌过期时间的Date对象 */)); // 3. 用AllTokenDto包装两个令牌 AllTokenDto allTokenDto = new AllTokenDto(); allTokenDto.setAccess_token(accessToken); allTokenDto.setRefresh_token(refreshToken); // 4. 将令牌数据设置到ResponseDto responseDto.setToken(allTokenDto);
3. 处理日期序列化格式(可选)
目标响应中expired_at是yyyyMMdd格式的字符串,需给TokenDto的expiredDate字段添加序列化注解,确保输出格式匹配:
import com.fasterxml.jackson.annotation.JsonFormat; class TokenDto{ String token; // 指定日期序列化格式为yyyyMMdd @JsonFormat(pattern = "yyyyMMdd") Date expiredDate; // 补充getter/setter方法 }
完整示例代码
// 初始化响应DTO并设置用户信息 ResponseDto responseDto = new ResponseDto(); responseDto.setUser(modelMapper.map(userData, UserDto.class)); // 构建access token TokenDto accessToken = new TokenDto(); accessToken.setToken("bhacvyusbi"); accessToken.setExpiredDate(java.sql.Date.valueOf("2020-02-10")); // 构建refresh token TokenDto refreshToken = new TokenDto(); refreshToken.setToken("bhacvyusbi"); refreshToken.setExpiredDate(java.sql.Date.valueOf("2020-02-10")); // 包装令牌并设置到响应DTO AllTokenDto allTokenDto = new AllTokenDto(); allTokenDto.setAccess_token(accessToken); allTokenDto.setRefresh_token(refreshToken); responseDto.setToken(allTokenDto);
内容的提问来源于stack exchange,提问作者Imesh Madushanka
相关产品推荐
相关产品推荐

