SpringBoot 2.x (5):异常处理与部署WAR项目
异常处理:
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项目的更多相关文章
- 【SpringBoot】单元测试进阶实战、自定义异常处理、t部署war项目到tomcat9和启动原理讲解
========================4.Springboot2.0单元测试进阶实战和自定义异常处理 ============================== 1.@SpringBoot ...
- SpringBoot启动方式讲解和部署war项目到tomcat9
1.SpringBoot启动方式讲解和部署war项目到tomcat9简介:SpringBoot常见启动方式讲解和部署war项目Tomcat 1.ide启动 2.jar包方式启动 maven插件: &l ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第5节 SpringBoot部署war项目到tomcat9和启动原理讲解_22、SpringBoot启动方式和部署war项目到tomcat9
笔记 1.SpringBoot启动方式讲解和部署war项目到tomcat9 简介:SpringBoot常见启动方式讲解和部署war项目Tomcat 1.ide启动 2.jar包方式启动 ...
- tomcat从manager部署war项目上传失败
tomcat从manager部署war项目上传失败, 查看manager.2018-07-17.log 日志,可以看到如下信息. less manager.2018-07-17.log 17-Jul- ...
- tomcat 部署war项目
前提是 jdk环境已配好 把项目war包放到tomcat的webapps目录下 启动tomcat: 这里我把8080端口修改成了80 IP也修改了 如果没修改直接输入localhost:8080/te ...
- Jenkins自动化部署war项目
基于上一篇Jenkins安装环境,下面对自动打包部署做个备忘 1.安装:Publish over SSH 插件 2.安装完成后,进入下图配置 ↓↓↓ 3.翻到底下↓↓↓ 找到刚刚安装的Publish ...
- docker安装Tomcat并部署war项目
转载:https://blog.csdn.net/javahighness/article/details/82859596 1进入容器 docker exec -it mytomcat bash 以 ...
- tomcat 配置域名部署war 项目
第一步把打包好的war包 放到 tomcat目录下的webapps 下 截图: 第二步:找到tomcat目录下的server.xml配置文件 server.xml在conf文件夹下面 编辑server ...
- maven 使用tomcat插件 自动化部署war
1.相关环境变量 idea tomcat8 maven3 2.增加tomcat user, 修改 $CATALINA_HOME/conf/tomcat-users.xml <tomcat-use ...
随机推荐
- HTTP服务器用什么组件或者方式比较好
我目前用Indy的HttpServer组件来编写,但遇到一个暂时没有办法解决的问题,就是上传文件到这个HTTPServer,如果文件名包含中文,则会出现乱码.网上查了一下,这是个indy的遗留问题,据 ...
- 解决VMware安装Ubuntu的过程中窗口过小无法看到【下一步】按钮的问题
只要按住ALT键向上拖动窗口
- linux静默安装Oracle 11g
./runInstaller -silent -force -responseFile /home/oracle/software/database/response/orcl_install.rsp ...
- [Selenium] 使用Firefox Driver 示例
//导入Selenium 库和FirefoxDriver 库 package com.learningselenium.simplewebdriver; import org.openqa.selen ...
- 把文件类型转化为byte[]
转自:https://blog.csdn.net/xinxiqi/article/details/78899159 package com.sanqing.util; import java.io.B ...
- CentOS下安装SecureCRT的sz/rz工具包
对于使用SecureCRT的玩家,rzsz是一个灰常灰常实用的功能.但是定制安装的linux可能没有把rzsz包安装到系统,这对用securecrt这样的windows工具传输文件特别不方便.为了使用 ...
- 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 ...
- Cardboard profile的修改
Cardboard盒子中,手机屏幕大小.镜片离屏幕距离,屏幕分辨率等都会影响配戴者的眼中成像,通过对生成图像的变形可以部份解决这一问题,cardboard sdk中提供了cardboardprofil ...
- 洛谷 P2296 寻找道路【bfs+spfa】
反向建边bfs出不能到t的点,然后对每个能到这些点的点打上del标记,然后spfa的时候不经过这些点即可 #include<iostream> #include<cstdio> ...
- Codeforces Round #516 Div2 (A~D)By cellur925
比赛传送门 A. Make a triangle! 题目大意:给你三根木棒,选出其中一根木棒增加它的长度,使构成三角形,问增加的长度最小是多少. 思路:签到题,根据样例/三角形性质不难发现,答案就是最 ...