美文网首页
7. Spring4.x Controller通知

7. Spring4.x Controller通知

作者: 第八号灬当铺 | 来源:发表于2017-08-30 00:10 被阅读0次
    1. 定义一个公共的返回数据类
    package com.xiaohan;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 返回数据
     */
    public class R extends HashMap<String, Object> {
        private static final long serialVersionUID = 1L;
    
        // 定义一个枚举 定义 错误码跟错误信息
        public enum Code {
            OK(0, null), ERROR(-1, "未知异常,请联系管理员");
            private int code;
            private String msg;
    
            private Code(int code, String msg) {
                this.code = code;
                this.msg = msg;
            }
    
            public int getCode() {
                return code;
            }
    
            public String getMsg() {
                return msg;
            }
        }
    
        public R() {
            put("code", Code.OK.getCode());
        }
    
        public static R error() {
            return error(Code.ERROR.getCode(), Code.ERROR.getMsg());
        }
    
        public static R error(String msg) {
            return error(Code.ERROR.getCode(), msg);
        }
    
        public static R error(int code, String msg) {
            R r = new R();
            r.put("code", code);
            r.put("msg", msg);
            return r;
        }
    
        public static R ok(String msg) {
            R r = new R();
            r.put("msg", msg);
            return r;
        }
    
        public static R ok(Map<String, Object> map) {
            R r = new R();
            r.putAll(map);
            return r;
        }
    
        public static R ok() {
            return new R();
        }
    
        public R put(String key, Object value) {
            super.put(key, value);
            return this;
        }
    }
    
    1. 定义一个控制器通知
    package com.xiaohan.controller.advice;
    
    import com.xiaohan.R;
    import org.springframework.beans.propertyeditors.CustomDateEditor;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.WebDataBinder;
    import org.springframework.web.bind.annotation.*;
    
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    
    // 控制器通知
    @RestControllerAdvice
    public class ExceptionAdvice {
    
        // 全局处理指定的异常类型
        @ExceptionHandler(Exception.class)
        public R exceptionHandler(Exception e) {
            String message = e.getMessage();
            return R.error(message);
        }
    
        // 添加 键值对 到Model中
        @ModelAttribute
        public void addAttributes(Model model) {
            model.addAttribute("msg", "额外信息");
        }
    
        // 修改Date类型的参数 绑定模式
        @InitBinder
        public void initBinder1(WebDataBinder binder) {
            DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            dateFormat.setLenient(true);
    
            // 参数绑定 忽略id属性
            binder.setDisallowedFields("id");
    
            binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
        }
    }
    
    1. 定义一个控制器
    package com.xiaohan.controller;
    
    import com.xiaohan.R;
    import org.springframework.web.bind.annotation.ModelAttribute;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    @RestController
    public class AdviceController {
    
        private String id;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        @RequestMapping("/advice")
        public R getSomething(@ModelAttribute("msg") String msg, AdviceController adviceController,String id, Date date) {
            System.err.println(adviceController.getId());                       // null
            System.err.println(id);                                             // 1
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
            System.err.println(date == null ? date : sdf.format(date));         //20170829
            throw new RuntimeException(msg);
        }
    }
    
    1. 浏览器请求响应结果
    请求地址
    http://localhost/advice?id=1&date=2017-08-29 23:45:00
    
    响应结果
    {"msg":"额外信息","code":-1}
    

    输出

    null
    1
    20170829
    

    可以看到方法参数上的id参数并没有忽略值 但是对象中的id属性 是null值

    相关文章

      网友评论

          本文标题:7. Spring4.x Controller通知

          本文链接:https://www.haomeiwen.com/subject/boxzdxtx.html