lombok
添加lombok依赖。
org.projectlombok
lombok
annotationProcessor
lombok作用:注解增加getset方法等等
很方便,不用自己导getsettostring方法
如:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Goods {
private Long id;
private String name;
private String remark;
private Date createdTime;
}
热部署
在需要热部署的项目或module中添加如下依赖:
org.springframework.boot
spring-boot-devtools
runtime
热部署占内存多,改一次重启一次
SpringBoot 工程的健康监控
Spring Boot 中actuator模块提供了健康检查,审计、指标收集,HTTP跟踪等功能,可以帮助我们更好的管理和跟踪springboot项目。
在需要使用健康监控的项目或module中,添加如下依赖:
org.springframework.boot
spring-boot-starter-actuator
启动项目,在浏览器中输入如下地址:(SpringBoot默认打开的监控选项有限)
http://localhost/actuator
还可以在actuator列出的选中中进行点击,例如访问health
http://localhost/actuator/health
假如希望查看更多actuator选项,可以在spring boot中配置文件
application.properties中添加如下语句:
management.endpoints.web.exposure.include=*
然后,重启服务器,基于访问http://localhost/actuator地址)
SpringBoot 工程中的异常处理方式
我们在处理异常的过程中通常要遵循一定的设计规范,例如:
- 捕获异常时与抛出的异常必须完全匹配,或者捕获异常是抛出异常的父类类型。
- 避免直接抛出RuntimeException,更不允许抛出Exception或者Throwable,应使用有业务含义的自定义异常(例如ServiceException)。
- 捕获异常后必须进行处理(例如记录日志)。如果不想处理它,需要将异常抛给它的调用者。
- 最外层的逻辑必须处理异常,将其转化成用户可以理解的内容。
- 避免出现重复的代码(Don’t Repeat Yourself),即DAY原则。
创建项目或module,并添加web依赖,代码如下:
org.springframework.boot
spring-boot-starter-web
修改项目访问端口为80,例如
server.port=80
定义Controller类,代码如下:
package com.cy.pj.arithmetic.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class ArithmeticController {
@RequestMapping("doCompute/{n1}/{n2}")
@ResponseBody
public String doCompute(@PathVariable Integer n1,
@PathVariable Integer n2){
Integer result=n1/n2;
return "Result is "+result;
}
}
启动项目进行访问测试
在浏览器地址栏输入http://localhost/doCompute/10/2,检测输出结果。
Result is 5
默认异常处理
在浏览器地址栏输入http://localhost/doCompute/10/0,检测输出结果。
对于这样的默认异常处理(spring boot提供),用户体验不太友好,为了呈现更加友好的异常信息,我们通常要对异常进行自定义处理。
自己try异常处理
在控制层方法中,我们可以进行try catch处理,例如:
@RequestMapping("doCompute/{n1}/{n2}")
@ResponseBody
public String doCompute(@PathVariable Integer n1,
@PathVariable Integer n2){
try{
Integer result=n1/n2;
return "Result is "+result;
}catch(ArithmeticException e){
return "exception is "+e.getMessage();
}
}
一个Controller类中通常会有多个方法,这样多个方法中都写try语句进行异常处理会带来大量重复代码的编写,不易维护。
Controller内部定义异常处理方法
在Controller类中添加异常处理方法,代码如下:
@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public String doHandleArithmeticException(ArithmeticException e){
e.printStackTrace();
return "计算过程中出现了异常,异常信息为"+e.getMessage();
}
@ExceptionHandler注解描述的方法为异常处理方法(注解中的异常类型为可处理的异常类型),假如Controller类中的逻辑方法中出现异常后没有处理异常,则会查找Controller类中有没有定义异常处理方法,假如定义了,且可以处理抛出的异常类型,则由异常处理方法处理异常。
控制层中的全局异常处理类及方法定义
当项目由多个控制层类中有多个共性异常的处理方法定义时,我们可以将这些方法提取到公共的父类对象中,但是这种方式是一种强耦合的实现,不利于代码的维护。我们还可以借助spring框架中web模块定义的全局异常处理规范进行实现,例如定义全局异常处理类,代码如下:
package com.cy.pj.common.web;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ArithmeticException.class)
public String doHandleArithmeticException(ArithmeticException e){
e.printStackTrace();
return "计算过程中出现了异常,异常信息为"+e.getMessage();
}
}
其中,@RestControllerAdvice 注解描述的类为全局异常处理类,当控制层方法中的异常没有自己捕获,也没有定义其内部的异常处理方法,底层默认会查找全局异常处理类,调用对应的异常处理方法进行异常处理。
工程中的响应标准设计及实现
响应标准设计
/**
* 基于此对象封装服务端响应到客户端的数据
*/
public class ResponseResult {
/**响应状态码(有的人用code)*/
private Integer state=1;//1表示ok,0表示error,.....
/**状态码对应的信息*/
private String message="ok";
/**正确的响应数据*/
private Object data;
public ResponseResult(){}
public ResponseResult(String message){//new ResponseResult("delete ok"),
this.message=message;
}
public ResponseResult(Object data){//new ResponseResult(list);
this.data=data;
}
public ResponseResult(Throwable e){//new ResponseResult(e);
this.state=0;
this.message=e.getMessage();
}
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
响应数据的封装
import com.cy.pj.common.pojo.ResponseResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ArithmeticController {
@RequestMapping("/doCompute/{n1}/{n2}")
public ResponseResult doCompute(@PathVariable Integer n1, @PathVariable Integer n2){
Integer result=n1/n2;
ResponseResult r=new ResponseResult("计算结果:"+result);
r.setData(result);
return r;
}
}
在全局异常处理对象中进行异常响应数据的封装,例如:
import com.cy.pj.common.pojo.ResponseResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@RestControllerAdvice
public class GlobalExceptionHandler {
private static final Logger log= LoggerFactory.getLogger(GlobalExceptionHandler.class);//2
@ExceptionHandler(ArithmeticException.class)
public ResponseResult doHandleArithmeticException(ArithmeticException e){
e.printStackTrace();
log.info("exception {}",e.getMessage());
return new ResponseResult(e);//封装异常结果
}
}