目录
本次实验采用swagger2版本为2.9.2
一、参加各个依赖的配置文件夹用于存放配置类

二、 各配置类代码如下
package com.dragonwu.config.jackson;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
@Configuration
public class JacksonConfig {
/**
* 配置ObjectMapper
* @return
*/
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
objectMapper.registerModule(simpleModule);
objectMapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); //Asia/Shanghai
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
return objectMapper;
}
}
package com.dragonwu.config.jetcache;
import com.alicp.jetcache.anno.config.EnableCreateCacheAnnotation;
import com.alicp.jetcache.anno.config.EnableMethodCache;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableCreateCacheAnnotation
@EnableMethodCache(basePackages = "com.dragonwu.service.impl")
public class JetCacheConfig {
}
package com.dragonwu.config.mybatisplus;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
import com.baomidou.mybatisplus.extension.incrementer.H2KeyGenerator;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan("com.dragonwu.mapper")
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setDbType(DbType.MYSQL) ;
return paginationInterceptor ;
}
/**
* 乐观锁
* @Version
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor(){
OptimisticLockerInterceptor optimisticLockerInterceptor = new OptimisticLockerInterceptor();
return optimisticLockerInterceptor ;
}
/**
* 主键序列的生成
* ID_WORK 数字
* ID_WORK_STR 字符串
*/
@Bean
public IKeyGenerator iKeyGenerator(){
H2KeyGenerator h2KeyGenerator = new H2KeyGenerator();
return h2KeyGenerator ;
}
}
package com.dragonwu.config.redis;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
/**
* RedisTemplate
*/
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// redis key的序列化
StringRedisSerializer keyRedisSerializer = new StringRedisSerializer();
// redis value的序列化
GenericJackson2JsonRedisSerializer valueRedisSerializer = new GenericJackson2JsonRedisSerializer();
redisTemplate.setKeySerializer(keyRedisSerializer);
redisTemplate.setValueSerializer(valueRedisSerializer);
redisTemplate.setHashKeySerializer(keyRedisSerializer);
redisTemplate.setHashValueSerializer(valueRedisSerializer);
return redisTemplate ;
}
}
package com.dragonwu.config.resource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
import org.springframework.util.FileCopyUtils;
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Configuration
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf()
.disable()
.sessionManagement().disable()
.authorizeRequests()
.antMatchers(
"/users/setPassword" ,
"/users/register",
"/sms/sendTo",
"/gt/register" ,
"/login" ,
"/v2/api-docs",
"/swagger-resources/configuration/ui",//用来获取支持的动作
"/swagger-resources",//用来获取api-docs的URI
"/swagger-resources/configuration/security",//安全选项
"/webjars/**",
"/swagger-ui.html"
).permitAll()
.antMatchers("/**").authenticated()
.and().headers().cacheControl();
}
/**
* 设置公钥
*
* @param resources
* @throws Exception
*/
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.tokenStore(jwtTokenStore());
}
private TokenStore jwtTokenStore() {
JwtTokenStore jwtTokenStore = new JwtTokenStore(accessTokenConverter());
return jwtTokenStore;
}
@Bean // 放在ioc容器的
public JwtAccessTokenConverter accessTokenConverter() {
//resource 验证token(公钥) authorization 产生 token (私钥)
JwtAccessTokenConverter tokenConverter = new JwtAccessTokenConverter();
String s = null;
try {
ClassPathResource classPathResource = new ClassPathResource("coinexchange.txt");
byte[] bytes = FileCopyUtils.copyToByteArray(classPathResource.getInputStream());
s = new String(bytes, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
tokenConverter.setVerifierKey(s);
return tokenConverter;
}
}
package com.dragonwu.config.swagger;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.Arrays;
import java.util.List;
@Configuration
@EnableSwagger2
@EnableConfigurationProperties(SwaggerProperties.class)
public class SwaggerAutoConfiguration {
private SwaggerProperties swaggerProperties;
public SwaggerAutoConfiguration(SwaggerProperties swaggerProperties) {
this.swaggerProperties = swaggerProperties;
}
@Bean
public Docket docket() {
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage()))
.paths(PathSelectors.any())
.build();
// 安全的配置
docket.securitySchemes(securitySchemes()) // 安全规则
.securityContexts(securityContexts()); // 安全配置的上下问
return docket;
}
/**
* api 信息的简介
*
* @return
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder().contact(
new Contact(swaggerProperties.getName(), swaggerProperties.getUrl(), swaggerProperties.getEmail())
)
.title(swaggerProperties.getTitle())
.description(swaggerProperties.getDescription())
.version(swaggerProperties.getVersion())
.termsOfServiceUrl(swaggerProperties.getTermsOfServiceUrl())
.build();
}
/**
* 安全的规则配置
*
* @return
*/
private List<SecurityScheme> securitySchemes() {
return Arrays.asList(new ApiKey("Authorization", "Authorization", "Authorization"));
}
/**
* 安全的上下问
*
* @return
*/
private List<SecurityContext> securityContexts() {
return Arrays.asList(new SecurityContext(
Arrays.asList(new SecurityReference("Authorization", new AuthorizationScope[]{new AuthorizationScope("global", "accessResource")})),
PathSelectors.any()
));
}
}
package com.dragonwu.config.swagger;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@ConfigurationProperties(prefix = "swagger2")
public class SwaggerProperties {
/**
* 包扫描的路径
*/
private String basePackage ;
/**
* 联系人的名称
*/
private String name ;
/**
* 联系人的主页
*/
private String url ;
/**
* 联系人的邮箱
*/
private String email ;
/**
* API的标题
*/
private String title ;
/**
* API的描述
*/
private String description ;
/**
* API的版本号
*/
private String version ;
/**
* API的服务团队
*/
private String termsOfServiceUrl ;
}
三、常量配置

package com.dragonwu.constant;
/**
* 常用的常量
*/
public class Constants {
/**
* UTF-8 字符集
*/
public static final String UTF8 = "UTF-8";
/**
* GBK 字符集
*/
public static final String GBK = "GBK";
/**
* http请求
*/
public static final String HTTP = "http://";
/**
* https请求
*/
public static final String HTTPS = "https://";
/**
* 成功标记
*/
public static final Integer SUCCESS = 200;
/**
* 失败标记
*/
public static final Integer FAIL = 500;
/**
* 验证码 redis key
*/
public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
/**
* 验证码有效期(分钟)
*/
public static final long CAPTCHA_EXPIRATION = 2;
}
四、统一返回值对象、公共模型对象、WebLog切面

package com.dragonwu.model;
import com.dragonwu.constant.Constants;
import java.io.Serializable;
/**
* 公共的返回值对象
*
* @param <T>
*/
public class R<T> implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 成功
*/
public static final int SUCCESS = Constants.SUCCESS;
/**
* 失败
*/
public static final int FAIL = Constants.FAIL;
private int code;
private String msg;
private T data;
public static <T> R<T> ok() {
return restResult(null, SUCCESS, null);
}
public static <T> R<T> ok(T data) {
return restResult(data, SUCCESS, null);
}
public static <T> R<T> ok(T data, String msg) {
return restResult(data, SUCCESS, msg);
}
public static <T> R<T> fail() {
return restResult(null, FAIL, null);
}
public static <T> R<T> fail(String msg) {
return restResult(null, FAIL, msg);
}
public static <T> R<T> fail(T data) {
return restResult(data, FAIL, null);
}
public static <T> R<T> fail(T data, String msg) {
return restResult(data, FAIL, msg);
}
public static <T> R<T> fail(int code, String msg) {
return restResult(null, code, msg);
}
private static <T> R<T> restResult(T data, int code, String msg) {
R<T> apiResult = new R<>();
apiResult.setCode(code);
apiResult.setData(data);
apiResult.setMsg(msg);
return apiResult;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}package com.dragonwu.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* Web的日志记录
* elk
*/
@Data
@EqualsAndHashCode
public class WebLog {
/**
* 操作描述
*/
private String description;
/**
* 操作用户
*/
private String username;
/**
* 消耗时间
*/
private Integer spendTime;
/**
* 根路径
*/
private String basePath;
/**
* URI
*/
private String uri;
/**
* URL
*/
private String url;
/**
* 请求类型
*/
private String method;
/**
* IP地址
*/
private String ip;
/**
* 请求参数
*/
private Object parameter;
/**
* 返回结果
*/
private Object result;
}

package com.dragonwu.aspect;
import com.baomidou.mybatisplus.extension.api.IErrorCode;
import com.baomidou.mybatisplus.extension.exceptions.ApiException;
import com.dragonwu.model.R;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 1 内部API调用的异常处理
*/
@ExceptionHandler(value = ApiException.class)
public R handlerApiException(ApiException exception){
IErrorCode errorCode = exception.getErrorCode();
if(errorCode!=null){
return R.fail(errorCode) ;
}
return R.fail(exception.getMessage()) ;
}
/**
* 2 方法参数校验失败的异常
* MethodArgumentNotValidException
*
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public R handlerMethodArgumentNotValidException(MethodArgumentNotValidException exception){
BindingResult bindingResult = exception.getBindingResult();
if(bindingResult.hasErrors()){
FieldError fieldError = bindingResult.getFieldError();
if(fieldError!=null){
return R.fail(fieldError.getField()+fieldError.getDefaultMessage()) ;
}
}
return R.fail(exception.getMessage()) ;
}
/**
* 3 对象内部使用Validate 没有校验成功的异常
*/
@ExceptionHandler(BindException.class)
public R handlerBindException(BindException bindException){
BindingResult bindingResult = bindException.getBindingResult();
if(bindingResult.hasErrors()){
FieldError fieldError = bindingResult.getFieldError();
if(fieldError!=null){
return R.fail(fieldError.getField()+fieldError.getDefaultMessage()) ;
}
}
return R.fail(bindException.getMessage()) ;
}
}
package com.dragonwu.aspect;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import com.alibaba.fastjson.JSON;
import com.dragonwu.model.WebLog;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.annotation.Order;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
@Component
@Aspect
@Order(1)
@Slf4j
public class WebLogAspect {
/**
* 日志记录:
* 环绕通知:方法执行之前、之后
*/
/**
* 1 定义切入点
*/
@Pointcut("execution(* com.bjsxt.controller.*.*(..))") // controller 包里面所有类,类里面的所有方法 都有该切面
public void webLog(){}
/**
* 2 记录日志的环绕通知
*/
@Around("webLog()")
public Object recodeWebLog(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
Object result = null ;
WebLog webLog = new WebLog();
long start = System.currentTimeMillis() ;
// 执行方法的真实调用
result = proceedingJoinPoint.proceed(proceedingJoinPoint.getArgs());
long end = System.currentTimeMillis() ;
webLog.setSpendTime((int)(start-end)/1000); // 请求该接口花费的时间
// 获取当前请求的request对象
ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
// 获取安全的上下文
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String url = request.getRequestURL().toString();
webLog.setUri(request.getRequestURI()); // 设置请求的uri
webLog.setUrl(url);
webLog.setBasePath(StrUtil.removeSuffix(url, URLUtil.url(url).getPath())); // http://ip:port/
webLog.setUsername(authentication==null ? "anonymous":authentication.getPrincipal().toString()); // 获取用户的id
webLog.setIp(request.getRemoteAddr()); // TODO 获取ip 地址
// 获取方法
MethodSignature signature = (MethodSignature)proceedingJoinPoint.getSignature();
// 获取类的名称
String targetClassName = proceedingJoinPoint.getTarget().getClass().getName();
Method method = signature.getMethod();
// 因为我们会使用Swagger 这工具,我们必须在方法上面添加@ApiOperation(value="")该注解
// 获取ApiOperation
ApiOperation annotation = method.getAnnotation(ApiOperation.class);
webLog.setDescription(annotation==null ? "no desc":annotation.value());
webLog.setMethod(targetClassName+"."+method.getName()); // com.bjsxt.controller.UserController.login()
webLog.setParameter(getMethodParameter(method,proceedingJoinPoint.getArgs())); //{"key_参数的名称":"value_参数的值"}
webLog.setResult(result);
log.info(JSON.toJSONString(webLog,true));
return result ;
}
/**
* 获取方法的执行参数
* @param method
* @param args
* @return
* {"key_参数的名称":"value_参数的值"}
*/
private Object getMethodParameter(Method method, Object[] args) {
Map<String, Object> methodParametersWithValues = new HashMap<>();
LocalVariableTableParameterNameDiscoverer localVariableTableParameterNameDiscoverer =
new LocalVariableTableParameterNameDiscoverer();
// 方法的形参名称
String[] parameterNames = localVariableTableParameterNameDiscoverer.getParameterNames(method);
for (int i = 0; i <parameterNames.length ; i++) {
if(parameterNames[i].equals("password") || parameterNames[i].equals("file")){
methodParametersWithValues.put(parameterNames[i],"受限的支持类型") ;
}else{
methodParametersWithValues.put(parameterNames[i],args[i]) ;
}
}
return methodParametersWithValues ;
}
}
五、我的公共依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>wxl-coin-exchange</artifactId>
<groupId>com.dragonwu</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>coin-common</artifactId>
<dependencies>
<!-- 服务的注册中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 服务的配置中心-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!-- </dependency>-->
<!-- 服务的熔断和降级限流-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- 资源服务器-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
<!--远程调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- redis 操作-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- jetcache 缓存-->
<dependency>
<groupId>com.alicp.jetcache</groupId>
<artifactId>jetcache-starter-redis</artifactId>
</dependency>
<!-- spring 里面添加的一些工具类-->
<dependency>
<groupId>io.springside</groupId>
<artifactId>springside-utils</artifactId>
</dependency>
<!-- swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
</dependency>
<!-- swagger2的web界面-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
</dependency>
<!-- web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- hutool工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!--mapStruct依赖 高性能对象映射-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<scope>provided</scope>
</dependency>
<!-- 配置文件处理-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
</dependencies>
</project>六、测试配置是否正常
添加配置文件
server:
port: 8080
spring:
application:
name: coin-common
profiles:
active: dev
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://mysql-server:3307/coin-exchange
username: root
password: WXL1214??
redis:
host: redis-server
port: 6380
password: WXL1214??
cloud:
nacos:
discovery:
server-addr: nacos-server:8848
config:
enabled: false
file-extension: yaml
sentinel:
transport:
dashboard: sentinel-dashboard:8858
swagger2:
base-package: com.dragonwu.controller
name: liangtiandong
url: https://github.com/liangtiandong-cn
email: liangtiandong@live.com
title: Coin-Common模型的测试
description: Coin-Common模块测试开放
version: 2.0
terms-of-service-url: www.dragonwu.com
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mapper-locations: classpath:/mapper/*Mapper.xml
jetcache:
statIntervalMinutes: 15
areaInCacheName: false
local: #本地缓存的实现
default:
type: linkedhashmap
keyConvertor: fastjson
remote: #远程缓存的实现
default:
type: redis
keyConvertor: fastjson
valueEncoder: kryo
valueDecoder: kryo
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
host: ${spring.redis.host}
port: ${spring.redis.port}
password: ${spring.redis.password}添加缓存测试类:

package com.dragonwu.service.impl;
import com.alicp.jetcache.anno.CacheType;
import com.alicp.jetcache.anno.Cached;
import com.dragonwu.model.WebLog;
import com.dragonwu.service.TestService;
import org.springframework.stereotype.Service;
@Service
public class TestServiceImpl implements TestService {
@Cached(name="com.dragonwu.service.impl.TestServiceImpl:",key="#username",cacheType = CacheType.BOTH)
@Override
public WebLog get(String username) {
WebLog webLog=new WebLog();
webLog.setUsername(username);
webLog.setResult("ok");
return webLog;
}
}
添加控制器测试类

package com.dragonwu.controller;
import com.dragonwu.model.R;
import com.dragonwu.model.WebLog;
import com.dragonwu.service.TestService;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
@RestController
@Api(tags = "CoinCommon里面测试的接口")
public class TestController {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Autowired
private TestService testService;
@Autowired
private ObjectMapper objectMapper ;
@GetMapping("/common/test")
@ApiOperation(value = "测试方法", authorizations = {@Authorization("Authorization")})
@ApiImplicitParams({
@ApiImplicitParam(name = "param", value = "参数1", dataType = "String", paramType = "query", example = "paramValue"),
@ApiImplicitParam(name = "param1", value = "参数2", dataType = "String", paramType = "query", example = "paramValue")
})
public R<String> testMethod(String param, String param1) {
return R.ok("ok");
}
@GetMapping("/date/test")
@ApiOperation(value = "日期格式化测试",authorizations = {@Authorization("Authorization")})
public R<Date> testDate(){
return R.ok(new Date());
}
@GetMapping("/redis/test")
@ApiOperation(value = "Redis测试",authorizations = {@Authorization("Authorization")})
public R<String> testRedis(){
WebLog webLog=new WebLog();
webLog.setResult("ok");
webLog.setMethod("com.dragonwu.domain.WebLog.testRedis");
webLog.setUsername("1110");
redisTemplate.opsForValue().set("com.dragonwu.domain.WebLog",webLog);
return R.ok("OK");
}
@GetMapping("/jetcache/test")
@ApiOperation(value = "jetcache缓存测试",authorizations = {@Authorization("Authorization")})
public R<String> testJetCache(String username){
WebLog webLog=testService.get(username);
System.out.println(webLog);
return R.ok("OK");
}
}添加测试启动类
package com.dragonwu;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class CoinCommonApplication {
public static void main(String[] args) {
SpringApplication.run(CoinCommonApplication.class,args);
}
}
启动后查看api的swagger客户端

获取一下token

复制一下token,填写进入测试,密码为:bearer 哪个token(中间是空格)。

解锁测试接口

可以看到日志已经打印

同样的方法测试时间接口

正常!
同样方法测试各个接口后的效果

jetcache缓存也没问题

至此common模块测试完毕!
将测试项删除最终的目录结构

版权声明:本文为qq_50909707原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。