异常处理:

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. HTTP服务器用什么组件或者方式比较好

    我目前用Indy的HttpServer组件来编写,但遇到一个暂时没有办法解决的问题,就是上传文件到这个HTTPServer,如果文件名包含中文,则会出现乱码.网上查了一下,这是个indy的遗留问题,据 ...

  2. 解决VMware安装Ubuntu的过程中窗口过小无法看到【下一步】按钮的问题

    只要按住ALT键向上拖动窗口

  3. linux静默安装Oracle 11g

    ./runInstaller -silent -force -responseFile /home/oracle/software/database/response/orcl_install.rsp ...

  4. [Selenium] 使用Firefox Driver 示例

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

  5. 把文件类型转化为byte[]

    转自:https://blog.csdn.net/xinxiqi/article/details/78899159 package com.sanqing.util; import java.io.B ...

  6. CentOS下安装SecureCRT的sz/rz工具包

    对于使用SecureCRT的玩家,rzsz是一个灰常灰常实用的功能.但是定制安装的linux可能没有把rzsz包安装到系统,这对用securecrt这样的windows工具传输文件特别不方便.为了使用 ...

  7. View Controller Programming Guide for iOS---(二)---View Controller Basics

    View Controller Basics Apps running on iOS–based devices have a limited amount of screen space for d ...

  8. Cardboard profile的修改

    Cardboard盒子中,手机屏幕大小.镜片离屏幕距离,屏幕分辨率等都会影响配戴者的眼中成像,通过对生成图像的变形可以部份解决这一问题,cardboard sdk中提供了cardboardprofil ...

  9. 洛谷 P2296 寻找道路【bfs+spfa】

    反向建边bfs出不能到t的点,然后对每个能到这些点的点打上del标记,然后spfa的时候不经过这些点即可 #include<iostream> #include<cstdio> ...

  10. Codeforces Round #516 Div2 (A~D)By cellur925

    比赛传送门 A. Make a triangle! 题目大意:给你三根木棒,选出其中一根木棒增加它的长度,使构成三角形,问增加的长度最小是多少. 思路:签到题,根据样例/三角形性质不难发现,答案就是最 ...