7. Spring4.x Controller通知

  1. 定义一个公共的返回数据类
package com.xiaohan;

import java.util.HashMap;
import java.util.Map;

/**
 * 返回数据
 */
public class R extends HashMap {
    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 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通知)