• RequestBodyAdvice和注解方式进行统一参数处理demo


    RequestBodyAdvice和注解方式进行统一参数处理demo

    @Target({ ElementType.METHOD, ElementType.TYPE })
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface HttpBodyDecrypt {
    
    }
    
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.example.mytester.entity.Student;
    import org.springframework.core.MethodParameter;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpInputMessage;
    import org.springframework.http.converter.HttpMessageConverter;
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice;
    
    import java.io.*;
    import java.lang.reflect.Type;
    import java.nio.charset.Charset;
    
    @ControllerAdvice(basePackages = "com.example.mytester.controller")
    public class GlobalRequestBodyAdvice implements RequestBodyAdvice {
    
        @Override
        public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
            System.out.println(">>>GlobalRequestBodyAdvice supports");
            //只有打上注解标记的才执行 @HttpBodyDecrypt
            boolean flag = methodParameter.hasMethodAnnotation(HttpBodyDecrypt.class);
            if(flag) {
                return true;
            }
            return false;
        }
    
        @Override
        public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) throws IOException {
            System.out.println(">>>GlobalRequestBodyAdvice beforeBodyRead");
            //方案2
            return new XHttpInputMessage(inputMessage, "UTF-8");
    
            //方案1
    //        StringBuilder sb = new StringBuilder();
    //        BufferedReader reader = null;
    //        try {
    //            reader = new BufferedReader(new InputStreamReader(inputMessage.getBody(), Charset.defaultCharset()));
    //            String line;
    //            while ((line = reader.readLine()) != null) {
    //                sb.append(line);
    //            }
    //        } catch (IOException e) {
    //            e.printStackTrace();
    //            throw new RuntimeException(e);
    //        } finally {
    //            if (reader != null) {
    //                try {
    //                    reader.close();
    //                } catch (IOException e) {
    //                    e.printStackTrace();
    //                }
    //            }
    //        }
    //        JSONObject jsonObject = JSONObject.parseObject(sb.toString());
    //        System.out.println("覆盖之前的json串=" + jsonObject.toString());
    //
    //        if (jsonObject != null){
    //            //改变
    //            if(jsonObject.get("name") != null) {
    //                jsonObject.put("name", "AMD");
    //            }
    //
    //            //针对字段来处理
    //            String afterStr = jsonObject.toJSONString();
    //            System.out.println("覆盖之后的json串="+afterStr);
    //
    //            //字符串转输入流
    //            InputStream rawInputStream = new ByteArrayInputStream(afterStr.getBytes());
    //            return new HttpInputMessage(){
    //
    //                @Override
    //                public HttpHeaders getHeaders() {
    //                    return inputMessage.getHeaders();
    //                }
    //
    //                @Override
    //                public InputStream getBody() throws IOException {
    //                    return rawInputStream;
    //                }
    //            };
    //        }
    //        return  inputMessage;
        }
    
        @Override
        public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
            System.out.println(">>>GlobalRequestBodyAdvice afterBodyRead");
            return body;
        }
    
        @Override
        public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {
            System.out.println(">>>GlobalRequestBodyAdvice handleEmptyBody");
            return body;
        }
    }
    
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.example.mytester.entity.Student;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpInputMessage;
    
    import java.io.*;
    import java.nio.charset.Charset;
    
    public class XHttpInputMessage implements HttpInputMessage {
        private HttpHeaders headers;
        private InputStream body;
    
        public XHttpInputMessage(HttpInputMessage httpInputMessage, String encode) throws IOException {
            this.headers = httpInputMessage.getHeaders();
            this.body = encode(httpInputMessage,httpInputMessage.getBody(), encode);
        }
    
        private InputStream encode(HttpInputMessage httpInputMessage, InputStream body, String encode) {
            //省略对流进行编码的操作
            StringBuilder sb = new StringBuilder();
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new InputStreamReader(body, Charset.defaultCharset()));
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            JSONObject jsonObject = JSONObject.parseObject(sb.toString());
    
            if (jsonObject != null){
                System.out.println("XHttpInputMessage获取json=" + jsonObject.toString());
    
                Student student = JSONObject.parseObject(jsonObject.toString(), Student.class);
    
                System.out.println("XHttpInputMessage修改之前的学生名称为:" + student.getName());
                student.setName("AMD");  //改变值
    
                String afterStr = JSON.toJSONString(student);
    
                //字符串转输入流
                InputStream rawInputStream = new ByteArrayInputStream(afterStr.getBytes());
                return rawInputStream;
            }
    
            return body;
        }
    
        @Override
        public InputStream getBody() throws IOException {
            return body;
        }
    
        @Override
        public HttpHeaders getHeaders() {
            return headers;
        }
    }
    
    
    public class ClassRoom {
        private static final long serialVersionUID = -339516038496531943L;
        private String sno;
        private String name;
        private String sex;
        public String getSno() {
            return sno;
        }
        public void setSno(String sno) {
            this.sno = sno;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getSex() {
            return sex;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "sno='" + sno + '\'' +
                    ", name='" + name + '\'' +
                    ", sex='" + sex + '\'' +
                    '}';
        }
    }
    
    
    
    @RestController
    public class TestController {
    
        /**
         * http://localhost:8080/addstudent4
         * 参数:{"sno":"11124","name":"xiaoming","sex":"man"}
         * 返回:
         * Student{sno='11124', name='AMD', sex='man'}
         *
         * @param student
         * @param request
         * @return
         */
        @HttpBodyDecrypt
        @RequestMapping(value = "/addstudent4", method = RequestMethod.POST)
        public String saveStudent4(@RequestBody ClassRoom student, HttpServletRequest request) {
            return student.toString();
        }
    }
  • 相关阅读:
    高性能服务器开发基础系列 (二)Reactor模式
    高性能服务器开发基础系列 (二)Reactor模式
    高性能服务器开发基础系列 (二)Reactor模式
    javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
    JS基础入门篇(十)— 数组方法
    JS基础入门篇(十)— 数组方法
    C# WinForm 文件上传下载
  • 原文地址:https://www.cnblogs.com/oktokeep/p/16779573.html
Copyright © 2020-2023  润新知