整体的项目架构相比之前写的demo多了其他的配置,比如涉及硬件,需要编写有关于硬件的代码;涉及遥感获取地理信息需要编写引用高德api来实现;此外还有其他一些零零碎碎需要编写的功能,使整个项目体系更为完整。但是唯一不变的还是 controller service及其对应的实现类 之后对应另一个service层 编写相应的mapper,最开始的都是打框架。
RedisConfig:
/**
* redis配置
@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
/**
* 生成key的策略
*/
@Bean
@Override
public KeyGenerator keyGenerator() {
return (target, method, params) -> {
StringBuilder sb = new StringBuilder();
sb.append(method.getName());
for (Object obj : params) {
sb.append("_").append(obj.toString());
}
return sb.toString();
};
}
/**
* 缓存管理器
*/
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = jackson2JsonRedisSerializer();
RedisCacheConfiguration redisCacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig()
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.entryTtl(Duration.ofHours(1));
return RedisCacheManager
.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
.cacheDefaults(redisCacheConfiguration).build();
}
/**
* RedisTemplate配置
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = jackson2JsonRedisSerializer();
//序列化 value 时使用此序列化方法
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
// 序列化 key 时
StringRedisSerializer srs = new StringRedisSerializer();
template.setKeySerializer(srs);
template.setHashKeySerializer(srs);
template.afterPropertiesSet();
return template;
}
public Jackson2JsonRedisSerializer jackson2JsonRedisSerializer() {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
jackson2JsonRedisSerializer.setObjectMapper(new ObjectMapper()
.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY)
//解决jackson2无法反序列化LocalDate、 LocalDateTime的问题
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.registerModule(new JavaTimeModule())
//设置存入缓存时按具体的类型存入
.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
ObjectMapper.DefaultTyping.NON_FINAL,
JsonTypeInfo.As.WRAPPER_ARRAY));
return jackson2JsonRedisSerializer;
}
}
WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于java-based方式的spring mvc配置,需要创建一个配置类并实现WebMvcConfigurer 接口;
webconfig:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Value("${server.file-upload-path}")
private String filePath;
/**
*
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedHeaders("*")
.allowedMethods("*")
.allowCredentials(true);
}
/**
* 静态路径
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//在默认"/**"静态文件映射上添加"file: filePath/"
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/", "/","file:" + filePath);
}
/**
* 文件上传临时目录
* @return
*/
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
String tmpPath = filePath + File.separator + "temp" + File.separator;
File file = new File(tmpPath);
if (!file.exists()) {
file.mkdirs();
}
factory.setLocation(tmpPath);
return factory.createMultipartConfig();
}
}