异常处理:

SpringBoot的异常处理是不友好的,前端只会显示最基本的错误名称

后端控制台会报出具体的错误,那么我们如何告知前端具体的错误信息呢?

1:对全局异常进行处理

一个测试的Controller:

package org.dreamtech.springboot.exception;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class ExceptionController {
@RequestMapping("/test/exception")
private Object test() {
int i = 1 / 0;
return "test";
}
}

自定义一个异常处理类:

package org.dreamtech.springboot.exception;

import java.util.HashMap;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice
//类似的,有@ControllerAdvice
public class CustomExceptionHandler { @ExceptionHandler(value = Exception.class)
Object handleException(Exception e, HttpServletRequest request) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", 100);
map.put("errMsg", e.toString());
map.put("url", request.getRequestURI());
return map;
}
}

更进一步,可以加入日志处理:

package org.dreamtech.springboot.exception;

import java.util.HashMap;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice
public class CustomExceptionHandler { private static final Logger LOG = LoggerFactory.getLogger(CustomExceptionHandler.class); @ExceptionHandler(value = Exception.class)
Object handleException(Exception e, HttpServletRequest request) {
LOG.error("url {},msg {}", request.getRequestURI(), e.toString());
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", 100);
map.put("errMsg", e.toString());
map.put("url", request.getRequestURI());
return map;
}
}

如果前端访问了测试URL,应该显示的内容是:

{"code":100,"errMsg":"java.lang.ArithmeticException: / by zero","url":"/test/exception"}

2.自定义异常处理

导入SpringBoot推荐的thymeleaf模板引擎:

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

新建自定义异常类:

package org.dreamtech.springboot.exception;

public class MyException extends RuntimeException {

    private static final long serialVersionUID = -1876094492594770999L;

    public MyException(String code, String msg) {
super();
this.code = code;
this.msg = msg;
} private String code;
private String msg; public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} public String getMsg() {
return msg;
} public void setMsg(String msg) {
this.msg = msg;
} }

测试Controller:

package org.dreamtech.springboot.exception;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class ExceptionController {
@RequestMapping("/test/exception")
private Object test() {
throw new MyException("101", "error");
}
}

异常处理类:

package org.dreamtech.springboot.exception;

import javax.servlet.http.HttpServletRequest;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView; @ControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(value = MyException.class)
Object handleException(MyException e, HttpServletRequest request) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error.html");
modelAndView.addObject("msg", e.toString());
System.out.println(e.toString());
return modelAndView;
}
}

可以看出,我这里是返回了一个错误页面:error.html,当然也可以返回JSON,类似上面的@RestControllerAdvice

巧合的是,我运行SpringBoot之后发现所有错误页面都跳转到error.html,一开始以为是配置错误了

后来仔细测试后发现,SpringBoot默认将error.html作为同意异常处理页面了,哈哈

 部署WAR项目:

通常情况下,我们都会将SpringBoot项目打包成JAR包,然后java -jar启动

然而,有些特殊情况下,我们不得不使用老方式打包成WAR然后部署Tomcat

无论打包成JAR还是WAR都需要MAVEN插件:通常自动生产的项目是自带的

    <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

如果要打包成WAR,首先需要定义打包方式为WAR:

    <packaging>war</packaging>

然后在BUILD中加入项目名称:

    <build>
<finalName>demo</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

下载Tomcat,针对SpringBoot2.x推荐Tomcat9以上版本

https://tomcat.apache.org/download-90.cgi

修改启动类:

public class DemoApplication extends SpringBootServletInitializer {

    @Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
} public static void main(String[] args) throws Exception {
SpringApplication.run(DemoApplication.class, args);
} }

然后打包即可

容器不只有Tomcat,还有Jetty和Undertow等等,只不过最常用的是Tomcat

针对容器的性能,可以采用Jmter进行测试

SpringBoot的启动流程:

SpringBoot 2.x (5):异常处理与部署WAR项目的更多相关文章

  1. 【SpringBoot】单元测试进阶实战、自定义异常处理、t部署war项目到tomcat9和启动原理讲解

    ========================4.Springboot2.0单元测试进阶实战和自定义异常处理 ============================== 1.@SpringBoot ...

  2. SpringBoot启动方式讲解和部署war项目到tomcat9

    1.SpringBoot启动方式讲解和部署war项目到tomcat9简介:SpringBoot常见启动方式讲解和部署war项目Tomcat 1.ide启动 2.jar包方式启动 maven插件: &l ...

  3. 小D课堂 - 零基础入门SpringBoot2.X到实战_第5节 SpringBoot部署war项目到tomcat9和启动原理讲解_22、SpringBoot启动方式和部署war项目到tomcat9

    笔记 1.SpringBoot启动方式讲解和部署war项目到tomcat9 简介:SpringBoot常见启动方式讲解和部署war项目Tomcat 1.ide启动     2.jar包方式启动    ...

  4. tomcat从manager部署war项目上传失败

    tomcat从manager部署war项目上传失败, 查看manager.2018-07-17.log 日志,可以看到如下信息. less manager.2018-07-17.log 17-Jul- ...

  5. tomcat 部署war项目

    前提是 jdk环境已配好 把项目war包放到tomcat的webapps目录下 启动tomcat: 这里我把8080端口修改成了80 IP也修改了 如果没修改直接输入localhost:8080/te ...

  6. Jenkins自动化部署war项目

    基于上一篇Jenkins安装环境,下面对自动打包部署做个备忘 1.安装:Publish over SSH 插件 2.安装完成后,进入下图配置 ↓↓↓ 3.翻到底下↓↓↓ 找到刚刚安装的Publish ...

  7. docker安装Tomcat并部署war项目

    转载:https://blog.csdn.net/javahighness/article/details/82859596 1进入容器 docker exec -it mytomcat bash 以 ...

  8. tomcat 配置域名部署war 项目

    第一步把打包好的war包 放到 tomcat目录下的webapps 下 截图: 第二步:找到tomcat目录下的server.xml配置文件 server.xml在conf文件夹下面 编辑server ...

  9. maven 使用tomcat插件 自动化部署war

    1.相关环境变量 idea tomcat8 maven3 2.增加tomcat user, 修改 $CATALINA_HOME/conf/tomcat-users.xml <tomcat-use ...

随机推荐

  1. linux 一个超简单的makefile

    makefile 自动化变量:   $@ : 规则的目标文件名  例如:main:main.o test.o                    g++ -Wall -g  main.o test. ...

  2. Java 远程调用之Hessian简例

    1. [代码]1.服务接口(Hello.java) package server; public interface Hello { String hello(String name);}2. [代码 ...

  3. 怎么往mac中finder个人收藏里添加文件夹

    1.打开Finder,点击左上角finder偏好设置 2.选择边栏 3.如果侧栏中没有的文件夹,直接长按文件夹直接拖入.

  4. [Selenium] 使用Firefox Driver 示例

    //导入Selenium 库和FirefoxDriver 库 package com.learningselenium.simplewebdriver; import org.openqa.selen ...

  5. javascript之递归得DOM文本

    var  tag=document.getElementsByTagName('body')[0]; function findChild(tag){ var child=tag.childNodes ...

  6. bzoj2004公交线路——DP+矩阵加速递推

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 求方案数,想到DP: 因为两个站间距离<=p,所以每p个站中所有车一定都会停靠至 ...

  7. 在word文档中添加上角标和下角标

    方法一 摘录:https://jingyan.baidu.com/article/02027811b4d2da1bcc9ce5f7.html 方法二 利用MathType数学公式编辑器 exe下载:h ...

  8. VS2008 MFC截取整个屏幕并保存为jpg格式

    void CMainFrame::OnSavejpg() { // TODO: 在此添加命令处理程序代码 HWND hwnd = this->GetSafeHwnd(); //得到窗口句柄 HD ...

  9. SUI使用经验

    基本布局结构: 本地js.css请使用正确的路径 <!DOCTYPE html> <html> <head> <meta charset="utf- ...

  10. B. Color the Fence

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...