実戦分析:Spring boot&Freemaker統一異常処理FreeMarker template error

2810 ワード

FreemarkerException Handler設定を参考にしてフリーマーケットページ上の異常を捕獲します.
Freemarkerページで$を使うと、
また、アメリカは空です.Freemarkerページが崩れます.標準値を設定する必要があります.オブジェクトが空のエラーを回避します.
同じ理屈で$US er.userNameもこのように書くべきです.
今は必要なものがあります.もし使ったら、ページが崩れたくないです.どうすればいいですか?
本文で使用するのはスプリングMVC-servlet.xmlを配置する方式です.
Spring bootでは、propertiesまたはymlファイルに追加します.
spring.freemarker.settings.template_exception_handler=com.***.FreemarkerExceptionHandler
このような異常はどの種類が処理されますか?
そしてクラスの内容は
package com.***.exception;

import freemarker.core.Environment;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import java.io.IOException;
import java.io.Writer;

public class FreemarkerExceptionHandler implements TemplateExceptionHandler {
    private static final Logger log = LoggerFactory.getLogger(FreemarkerExceptionHandler.class);
    @Override
    public void handleTemplateException(TemplateException te, Environment env, Writer out) throws TemplateException {
	    	log.warn("[Freemarker Error: " + te.getMessage() + "]");
	        String missingVariable = "undefined";
	        try {
	            String[] tmp = te.getMessageWithoutStackTop().split("
"); if (tmp.length > 1) tmp = tmp[1].split(" "); if (tmp.length > 1) missingVariable = tmp[1]; out.write(""); log.error("[ , ]", te); } catch (IOException e) { throw new TemplateException( "Failed to print error message. Cause: " + e, env); } } }
ここに来て、異常を投げたとしか言えませんが、このエラーはやはりエラーとして報告されています.フロントでレンダリングしている間に、このエラーはブロックできます.
そして処理すべき点:
Spring Bootは、処理中に異常が発生すると、要求に処理が移り、グローバルエラーページがあるデフォルトのマッピングを提供する.
異常内容を示すために使用します.
この要求にはグローバルエラーページがあります.
だから私達は足を着手して、このルートの呼び出しの種類から手をつけます.
Spring Boot Error Controllerインターフェース処理404、500などのエラーページを実現します.
私たちはError Controllerインターフェースを実現し、handleErr方法を書き換える必要があります.
したがって、あなたのカスタム統一異常処理クラスの構造は 
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping(value = "error")
public class CustomErrorController implements ErrorController {

	@Override
	public String getErrorPath() {
		return "error40x";//        404    fileName, template    
	}
	
	@RequestMapping
	public String error() {
		return getErrorPath();
	}

}