文章目录
- 定义父类DTO
package com.zzx.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import lombok.Data;
@Data
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXISTING_PROPERTY,
property = "productCode",
visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = UserPasswordDTO.class, name = LoginDTO.USERNAME_PASSWORD),
@JsonSubTypes.Type(value = UserPhoneDTO.class,name = LoginDTO.PHONE_SMS_PRODUCT),
})
@JsonIgnoreProperties(ignoreUnknown = true)
public class LoginDTO {
public static final String PHONE_SMS_PRODUCT = "phoneSms";
public static final String USERNAME_PASSWORD = "password";
private String productCode;
public LoginDTO() {
}
}
-
定义需要登录类型的子类
- 账号密码登录
package com.zzx.dto; import lombok.Data; @Data public class UserPasswordDTO extends LoginDTO { private String userName; private String password; @Override public String getProductCode() { return LoginDTO.USERNAME_PASSWORD; } }
- 手机号验证码登录
package com.zzx.dto; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data public class UserPhoneDTO extends LoginDTO { /** * 区位码 */ private String areaCode; /** * 手机号 */ private String phoneNum; /** * 验证码 */ private String verifyCode; @Override public String getProductCode() { return LoginDTO.PHONE_SMS_PRODUCT; } }
- 账号密码登录
-
测试(注意,传入的 productCode 必须和在@JsonSubTypes.Type中定义好的name的值一致 )
package com.zzx;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zzx.dto.LoginDTO;
import com.zzx.dto.UserPasswordDTO;
import com.zzx.dto.UserPhoneDTO;
public class LoginTest {
public static void main(String[] args) throws JsonProcessingException {
Map<String, String> params = new HashMap<>();
params.put("productCode", "password");
params.put("userName", "userName");
params.put("password", "password");
params.put("phoneNum", null);
params.put("verifyCode", null);
ObjectMapper mapper = new ObjectMapper();
String res = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(params);
LoginDTO loginDTO = mapper.readValue(res, LoginDTO.class);
System.out.println("loginDTO : "+JSON.toJSONString(loginDTO));
if (loginDTO instanceof UserPasswordDTO){
System.out.println("userPassword : "+JSON.toJSONString(loginDTO));
}
if (loginDTO instanceof UserPhoneDTO){
System.out.println("userPhone : "+JSON.toJSONString(loginDTO));
}
}
}