1、背景
在WEB應用中可能存在簡化入參的情況,比如:LoginInfo對象
@AllArgsConstructor
@NoArgsConstructor
@Data
public class LoginInfo implements Serializable {
private String username;
private String password;
private Dept dept;
}
在前端傳入的時候Dept采用自定義字符串的方式傳入,比如:dept="1:開發部",用冒號分隔,第一個字段是id,第二個字段是名稱。
通過這種方式傳入又分為表單提交和json提交兩種方式。
在Springboot中分別以自定義實現Converter接口以及JsonDeserializer接口兩種方式。
2、表單方式支持
實現Converter接口,並注冊。
@Configuration(proxyBeanMethods = false)
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new Converter<String, Dept>() {
@Override
public Dept convert(String source) {
if(!StringUtils.isEmpty(source)){
String[] split = source.split(":");
Dept dept = new Dept();
dept.setId(split[0]);
dept.setDeptName(split[1]);
return dept;
}
return null;
}
});
}
}
接收參數時:
@ResponseBody
@PostMapping("/login2")
public LoginInfo login2(LoginInfo loginInfo){
System.out.println(loginInfo);
return loginInfo;
}
前端使用正常表單提交,只是dept字段是一個"1:開發部"這樣的字符串。
當Springboot遇到Dept需要解析時,發現對應的值是字符串,就會調用自定義注冊的轉換器。
3、使用Json方式
實現JsonDeserializer接口
public class DeptDeserializer extends JsonDeserializer<Dept> {
@Override
public Dept deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
String text = p.getText();
if (!StringUtils.isEmpty(text)) {
String[] split = text.split(":");
Dept dept = new Dept();
dept.setId(split[0]);
dept.setDeptName(split[1]);
return dept;
}
return null;
}
}
LoginInfo需要重新標注
@AllArgsConstructor
@NoArgsConstructor
@Data
public class LoginInfo implements Serializable {
private String username;
private String password;
@JsonDeserialize(using = DeptDeserializer.class)
private Dept dept;
}
接收參數時:
@ResponseBody
@PostMapping("/login3")
public LoginInfo login3(@RequestBody LoginInfo loginInfo){
System.out.println(loginInfo);
return loginInfo;
}
前端傳參:
{
"username": "測試",
"password": "123",
"dept": "1:開發部"
}