zoukankan      html  css  js  c++  java
  • 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:开发部"
    }
    
  • 相关阅读:
    JDBC05JDBC控制事务4
    JDBC05详解各个类2
    JDBC05JDBC工具类3
    Tomcat&Servlet7_Tomcat2
    MySQL多表&事务04事务2
    JDBC连接池&JDBCTemplate06_Spring JDBC2
    JDBC连接池&JDBCTemplate06_数据库连接池1
    Tomcat&Servlet7_web服务器软件概述1
    MySQL多表&事务04DCL3
    用 JavaScript 的匿名函数理解 C# 的委托
  • 原文地址:https://www.cnblogs.com/asker009/p/14396601.html
Copyright © 2011-2022 走看看