广告系统开发-通用模块

通用模块

  • 通用代码定义、配置定义
  • 统一的响应处理
  • 统一的异常处理

定义响应模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

//lombok注解
@Data //相当于setter和getter构造器
@NoArgsConstructor//无参构造器
@AllArgsConstructor//全参构造器
public class CommonResponse<T> implements Serializable {

private Integer code;
private String message;
private T data;

public CommonResponse(Integer code, String message) {
this.code = code;
this.message = message;
}
}

进行统一响应的拦截

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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.lang.Nullable;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

//相当于返回json
@RestControllerAdvice
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {

@Override
@SuppressWarnings("all")//isAnnotationPresent()方法可能会造成空指针异常,可以将方法的warning隐藏起来
//通过方法参数或者类参数判断是否支持拦截
public boolean supports(MethodParameter methodParameter,
Class> aClass) {

//通过方法参数拿到类的声明,类的声明被下面的自定义注解标识,不想受到响应拦截的影响,返回false
if (methodParameter.getDeclaringClass().isAnnotationPresent(
IgnoreResponseAdvice.class
)) {
return false;
}
//方法层面上,同上理解
if (methodParameter.getMethod().isAnnotationPresent(
IgnoreResponseAdvice.class
)) {
return false;
}

return true;
}

@Nullable
@Override
@SuppressWarnings("all")
//对CommonResponse进行统一拦截
public Object beforeBodyWrite(@Nullable Object o,
MethodParameter methodParameter,
MediaType mediaType,
Class> aClass,
ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
//初始化统一响应的对象
CommonResponse response = new CommonResponse<>(0, "");
// o是返回对象,如果为空,直接返回0.
if (null == o) {
return response;
} else if (o instanceof CommonResponse) {
response = (CommonResponse) o;
} else {
response.setData(o);
}

return response;
}
}

自定义注解

1
2
3
4
5
6
7
8
9
10
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//表明注解可以作用在类和方法上
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IgnoreResponseAdvice {
}

统一异常的处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;

//返回值也是统一响应的类型
@RestControllerAdvice
public class GlobalExceptionAdvice {
//目标只是AdException类型
@ExceptionHandler(value = AdException.class)
//传入两个参数,一个是http请求,一个是自定义异常
public CommonResponse handlerAdException(HttpServletRequest req,
AdException ex) {
CommonResponse response = new CommonResponse<>(-1,
"business error");
response.setData(ex.getMessage());
return response;
}
}

统一配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;


@Configuration
public class WebConfiguration implements WebMvcConfigurer {

@Override
//参数传进一个有多个http转换器的列表
public void configureMessageConverters(List>
converters) {
//先清空
converters.clear();
//将java对象转化成json对象
converters.add(new MappingJackson2HttpMessageConverter());
}
}
0%