Springboot通過Converter和JsonDeserializer自定義web入參


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:開發部"
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM