Springブロックはcontroller層jsonデータの戻りを実現します.


Controller層の役割は業務ロジックを処理してデータを返しますが、データはどうやって戻りますか?インターフェースの要求はHttpServletRequestとHttpServletResonseによって前後端のインタラクションを実現し、ServletReponseには一つのgetWriterオブジェクトがあり、PrintWriterのprint()方法によってデータをHttpServResponseの先端に転送することができます.
      まず、リターンデータのmoduleを定義します.
public class ResponseModel {
    public static final int SUCCESS = 200;

    public static final int ERROR = 100;

    private Integer status;

    private String message;

    private Object data;

    private Locale locale;

    public ResponseModel(){
        this.status = SUCCESS;
        this.locale = Locale.CHINA;
    }

    public ResponseModel put(String key, Object value){
        if(this.data == null || !(data instanceof Map)){
            this.data = new HashMap();
        }
        Map map = (Map)this.data;
        map.put(key,value);
        return this;
    }

    public Object getData(){
        return data;
    }

    public ResponseModel setData(Object data){
        this.data = data;
        return this;
    }

    public ResponseModel setErrorMsg(ErrorMsg errorMsg){
        this.setStatus(errorMsg.getCode());
        this.setMessage(errorMsg.getMessage());
        return this;
    }
    public ResponseModel setStatus(int status){
        this.status = status;
        if(ERROR == status){
            this.setMessage("    ");
        }
        return this;
    }
    public ResponseModel setMessage(String message){
        this.message = message;
        return this;
    }
    public int getStatus(){
        return status;
    }
    public String getMessage(){
        return message;
    }
}
 
     holder Bean,  module           Bean ,
@Component
public class ResponseHolder {
    private static ThreadLocal model = new ThreadLocal<>();

    public void clean(){
        model.remove();
    }

    public ResponseModel getModel(){
        Object o = model.get();
        if(o == null){
            this.setModel(new ResponseModel());
            o = this.getObject();
        }
        if(o != null && o instanceof ResponseModel){
            return (ResponseModel) o;
        }else {
            return null;
        }
    }

    public Object getObject(){
        return model.get();
    }

    public void setModel(Object o){
        model.set(o);
    }

    public ResponseModel put(String key, Object value){
        ResponseModel responseModel = this.getModel();
        Object data = responseModel.getData();
        if(data == null || !(data instanceof Map)){
            data = new HashMap();
            responseModel.setData(data);
        }
        Map map = (Map) data;
        map.put(key,value);
        return responseModel;
    }

    public ResponseModel setData(Object data){
        ResponseModel responseModel = this.getModel();
        responseModel.setData(data);
        return responseModel;
    }

    public ResponseModel setErrorMsg(ErrorMsg errorMsg){
        ResponseModel responseModel = this.getModel();
        responseModel.setStatus(errorMsg.getCode());
        responseModel.setMessage(errorMsg.getMessage());
        return responseModel;
    }
}
 
   ErrorMsg       ,
public enum ErrorMsg {

    TEST(1,"test"),
    SUCCESS(200,"    "),
    LOGIN_FAIL(101,"    "),
    LOGOUT_SUCCESS(104,"    "),
    USER_NOT_FOUND(102,"     "),
    USER_DISABLED(103,"    "),
    NO_LOGIN(105,"   "),
    VERIFY_CODE_ERROR(106,"     "),
    SYSTEM_ERROR(100,"    ");

    private int code;
    private String message;

    public int getCode(){
        return code;
    }
    public String getMessage(){
        return message;
    }

    ErrorMsg(int code, String message){
        this.code = code;
        this.message = message;
    }
}
 
        ,   controller    holder       HttpServletResponse     ,
@Component
public class ResponseInterceptor implements HandlerInterceptor {

    @Autowired
    private ResponseHolder responseHolder;

    private Logger logger = LogManager.getLogger(ResponseInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception{
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest var1, HttpServletResponse var2, Object var3, ModelAndView var4) throws Exception{
        //do noting
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception exception) throws Exception{
        if(responseHolder == null){
            logger.error("system error", exception);
            responseHolder.setErrorMsg(ErrorMsg.SYSTEM_ERROR);
        }
        String json = JSON.toJSONString(responseHolder.getModel());
        this.returnJson(response,json);
        responseHolder.clean();
    }

    private void returnJson(HttpServletResponse response, String json) throws Exception{
        PrintWriter writer = null;
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=utf-8");
        try {
            writer = response.getWriter();
            writer.print(json);

        } catch (IOException e) {
            logger.error("response error",e);
        } finally {
            if (writer != null)
                writer.close();
        }
    }

}
springは、3つのpreHandle、postHandle、afterCompletion方法を提供します.preHandleは、トラフィックプロセッサ処理要求の前に呼び出しられ、    postHandleは、業務プロセッサ処理要求の実行が完了した後、ビューを生成する前に実行し、afterComplectionはDisplatServletで要求を完全に処理した後に呼び出しられ、リソースのクリーンアップなどに利用できます.
 
スクリーンセーバーの定義が完了した後、配置しないと機能しません.従来のspringプロジェクトはXMLファイルの構成により、spring-bootはXMLなしの設定を実現するために、以下のように追加できます.
@Configuration
public class WebAppConfig extends org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter {

    @Autowired
    private ResponseInterceptor responseInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(responseInterceptor).addPathPatterns("/**").excludePathPatterns("/identifyCode/generate");
    }

}
 
ここではスクリーン全体の核心であり、addInterceptorsインターフェースを実現することによって、自分が加えたいブロックを追加できます.また、ブロックを必要としないインターフェースを特別に配置することもできます.コードは簡単ですが、よく推測する価値があります.最適化できるところもたくさんあります.