1. 导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. 端口配置
server:port: 8080
3. 统一功能处理
3.1 拦截器
3.1.1 生成
package com.example.config;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;@Component
public class RequestInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 鉴权HttpSession session = request.getSession(false);if (session == null || session.getAttribute("username") == null) {response.setStatus(401);return false;}return true;}
}
3.1.2 注册
package com.example.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Autowiredprivate RequestInterceptor requestInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(requestInterceptor).addPathPatterns("/**").excludePathPatterns("/login");}
}
3.2 统一数据返回
package com.example.config;import com.example.model.Result;
import com.fasterxml.jackson.databind.json.JsonMapper;
import lombok.SneakyThrows;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;import java.lang.reflect.Method;@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {private final static JsonMapper mapper = new JsonMapper();@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {// 获取执行方法Method method = returnType.getMethod();System.out.println(method.getName());return true;}@SneakyThrows@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {if (body instanceof Result) {// 包含统一响应格式或异常处理直接返回return body;} else if (body instanceof String) {// String由于映射器原因,直接返回对象会报错,需要转换一下return mapper.writeValueAsString(Result.success(body));}return Result.success(body);}
}
3.3 统一异常处理
异常处理捕获后会从子到父依次匹配。
package com.example.config;import com.example.model.Result;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;@ResponseBody
@ControllerAdvice
public class ExceptionAdvice {@ExceptionHandlerpublic Object handler(Exception e) {return Result.fail("内部错误");}@ExceptionHandlerpublic Object handler(NullPointerException e) {return Result.fail("NullPointerException");}
}
3.4 执行顺序
拦截器
目标方法 统一异常处理 统一数据返回
拦截器