how2j.cn

下载区
文件名 文件大小
请先登录 34m
增值内容 34m
34m
请先登录 558k
增值内容 558k
558k
请先登录 455k
增值内容 455k
455k
使用站长秘制下载工具

24分34秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器

步骤 1 : Redis 概念   
步骤 2 : Redis 服务器   
步骤 3 : Redis 图形界面客户端   
步骤 4 : Redis配置   
步骤 5 : PortUtil   
步骤 6 : Application   
步骤 7 : application.properties   
步骤 8 : CategoryService 缓存配置   
步骤 9 : 客户端观察数据   
步骤 10 : ProductService 和 SpringContextUtil   
步骤 11 : 其他 Service   
步骤 12 : 可运行项目   

增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
步骤 3 :

Redis 图形界面客户端

edit
增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
Redis配置
package com.how2java.tmall.config; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; @Configuration //Redis 缓存配置类 public class RedisConfig extends CachingConfigurerSupport { @Bean public CacheManager cacheManager(RedisTemplate<?,?> redisTemplate) { RedisSerializer stringSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.PUBLIC_ONLY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); redisTemplate.setKeySerializer(stringSerializer); redisTemplate.setHashKeySerializer(stringSerializer); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); CacheManager cacheManager = new RedisCacheManager(redisTemplate); return cacheManager; } }
增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.util; import java.io.IOException; import java.net.ServerSocket; import javax.swing.JOptionPane; public class PortUtil { public static boolean testPort(int port) { try { ServerSocket ss = new ServerSocket(port); ss.close(); return false; } catch (java.net.BindException e) { return true; } catch (IOException e) { return true; } } public static void checkPort(int port, String server, boolean shutdown) { if(!testPort(port)) { if(shutdown) { String message =String.format("在端口 %d 未检查得到 %s 启动%n",port,server); JOptionPane.showMessageDialog(null, message); System.exit(1); } else { String message =String.format("在端口 %d 未检查得到 %s 启动%n,是否继续?",port,server); if(JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(null, message)) System.exit(1); } } } }
增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.boot.web.support.SpringBootServletInitializer; import org.springframework.cache.annotation.EnableCaching; import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import com.how2java.tmall.util.PortUtil; @SpringBootApplication @EnableCaching public class Application { static { PortUtil.checkPort(6379,"Redis 服务端",true); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
步骤 7 :

application.properties

edit
增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
#database spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tmall_springboot?characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=admin spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.hibernate.ddl-auto = none #thymeleaf spring.thymeleaf.mode=LEGACYHTML5 spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.content-type=text/html spring.thymeleaf.cache=false #context server.context-path=/tmall_springboot #设置上传文件大小,默认只有1 m spring.http.multipart.maxFileSize=100Mb spring.http.multipart.maxRequestSize=100Mb #jpa对实体类的默认字段会把驼峰命名的属性,转换为字段名的时候自动加上下划线。 这个配置的作用就是去掉下划线 #比如属性名称是 createDate, jpa 默认转换为字段名 create_Date。 有了这个配置之后,就会转换为同名字段 createDate spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl #显示 hibernate运行的 sql 语句 spring.jpa.show-sql=true #Redis数据库索引(默认为0) spring.redis.database=0 #Redis服务器地址 spring.redis.host=127.0.0.1 #Redis服务器连接端口 spring.redis.port=6379 #Redis服务器连接密码(默认为空) spring.redis.password= #连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=10 #连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1 #连接池中的最大空闲连接 spring.redis.pool.max-idle=8 #连接池中的最小空闲连接 spring.redis.pool.min-idle=0 #连接超时时间(毫秒) spring.redis.timeout=0
步骤 8 :

CategoryService 缓存配置

edit
增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
CategoryService 缓存配置
package com.how2java.tmall.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import com.how2java.tmall.dao.CategoryDAO; import com.how2java.tmall.pojo.Category; import com.how2java.tmall.pojo.Product; import com.how2java.tmall.util.Page4Navigator; @Service @CacheConfig(cacheNames="categories") public class CategoryService { @Autowired CategoryDAO categoryDAO; @CacheEvict(allEntries=true) // @CachePut(key="'category-one-'+ #p0") public void add(Category bean) { categoryDAO.save(bean); } @CacheEvict(allEntries=true) // @CacheEvict(key="'category-one-'+ #p0") public void delete(int id) { categoryDAO.delete(id); } @Cacheable(key="'categories-one-'+ #p0") public Category get(int id) { Category c= categoryDAO.findOne(id); return c; } @CacheEvict(allEntries=true) // @CachePut(key="'category-one-'+ #p0") public void update(Category bean) { categoryDAO.save(bean); } @Cacheable(key="'categories-page-'+#p0+ '-' + #p1") public Page4Navigator<Category> list(int start, int size, int navigatePages) { Sort sort = new Sort(Sort.Direction.DESC, "id"); Pageable pageable = new PageRequest(start, size,sort); Page pageFromJPA =categoryDAO.findAll(pageable); return new Page4Navigator<>(pageFromJPA,navigatePages); } @Cacheable(key="'categories-all'") public List<Category> list() { Sort sort = new Sort(Sort.Direction.DESC, "id"); return categoryDAO.findAll(sort); } //这个方法的用处是删除Product对象上的 分类。 为什么要删除呢? 因为在对分类做序列还转换为 json 的时候,会遍历里面的 products, 然后遍历出来的产品上,又会有分类,接着就开始子子孙孙无穷溃矣地遍历了,就搞死个人了 //而在这里去掉,就没事了。 只要在前端业务上,没有通过产品获取分类的业务,去掉也没有关系 public void removeCategoryFromProduct(List<Category> cs) { for (Category category : cs) { removeCategoryFromProduct(category); } } public void removeCategoryFromProduct(Category category) { List<Product> products =category.getProducts(); if(null!=products) { for (Product product : products) { product.setCategory(null); } } List<List<Product>> productsByRow =category.getProductsByRow(); if(null!=productsByRow) { for (List<Product> ps : productsByRow) { for (Product p: ps) { p.setCategory(null); } } } } }
步骤 9 :

客户端观察数据

edit
增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
客户端观察数据
步骤 10 :

ProductService 和 SpringContextUtil

edit
增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.service; import com.how2java.tmall.dao.ProductDAO; import com.how2java.tmall.pojo.Category; import com.how2java.tmall.pojo.Product; import com.how2java.tmall.util.Page4Navigator; import com.how2java.tmall.util.SpringContextUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; @Service @CacheConfig(cacheNames="products") public class ProductService { @Autowired ProductDAO productDAO; @Autowired ProductImageService productImageService; @Autowired CategoryService categoryService; @Autowired OrderItemService orderItemService; @Autowired ReviewService reviewService; @CacheEvict(allEntries=true) public void add(Product bean) { productDAO.save(bean); } @CacheEvict(allEntries=true) public void delete(int id) { productDAO.delete(id); } @Cacheable(key="'products-one-'+ #p0") public Product get(int id) { return productDAO.findOne(id); } @CacheEvict(allEntries=true) public void update(Product bean) { productDAO.save(bean); } @Cacheable(key="'products-cid-'+#p0+'-page-'+#p1 + '-' + #p2 ") public Page4Navigator<Product> list(int cid, int start, int size,int navigatePages) { Category category = categoryService.get(cid); Sort sort = new Sort(Sort.Direction.DESC, "id"); Pageable pageable = new PageRequest(start, size, sort); Page<Product> pageFromJPA =productDAO.findByCategory(category,pageable); return new Page4Navigator<>(pageFromJPA,navigatePages); } public void fill(List<Category> categorys) { for (Category category : categorys) { fill(category); } } @Cacheable(key="'products-cid-'+ #p0.id") public List<Product> listByCategory(Category category){ return productDAO.findByCategoryOrderById(category); } public void fill(Category category) { ProductService productService = SpringContextUtil.getBean(ProductService.class); List<Product> products = productService.listByCategory(category); productImageService.setFirstProdutImages(products); category.setProducts(products); } public void fillByRow(List<Category> categorys) { int productNumberEachRow = 8; for (Category category : categorys) { List<Product> products = category.getProducts(); List<List<Product>> productsByRow = new ArrayList<>(); for (int i = 0; i < products.size(); i+=productNumberEachRow) { int size = i+productNumberEachRow; size= size>products.size()?products.size():size; List<Product> productsOfEachRow =products.subList(i, size); productsByRow.add(productsOfEachRow); } category.setProductsByRow(productsByRow); } } public void setSaleAndReviewNumber(Product product) { int saleCount = orderItemService.getSaleCount(product); product.setSaleCount(saleCount); int reviewCount = reviewService.getCount(product); product.setReviewCount(reviewCount); } public void setSaleAndReviewNumber(List<Product> products) { for (Product product : products) setSaleAndReviewNumber(product); } public List<Product> search(String keyword, int start, int size) { Sort sort = new Sort(Sort.Direction.DESC, "id"); Pageable pageable = new PageRequest(start, size, sort); List<Product> products =productDAO.findByNameLike("%"+keyword+"%",pageable); return products; } }
package com.how2java.tmall.util; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import com.how2java.tmall.service.OrderService; @Component public class SpringContextUtil implements ApplicationContextAware { private SpringContextUtil() { } private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext){ SpringContextUtil.applicationContext = applicationContext; } public static <T> T getBean(Class<T> clazz) { return applicationContext.getBean(clazz); } }
增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢
package com.how2java.tmall.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import com.how2java.tmall.dao.OrderItemDAO; import com.how2java.tmall.pojo.Order; import com.how2java.tmall.pojo.OrderItem; import com.how2java.tmall.pojo.Product; import com.how2java.tmall.pojo.User; import com.how2java.tmall.util.SpringContextUtil; @Service @CacheConfig(cacheNames="orderItems") public class OrderItemService { @Autowired OrderItemDAO orderItemDAO; @Autowired ProductImageService productImageService; public void fill(List<Order> orders) { for (Order order : orders) fill(order); } @CacheEvict(allEntries=true) public void update(OrderItem orderItem) { orderItemDAO.save(orderItem); } public void fill(Order order) { OrderItemService orderItemService = SpringContextUtil.getBean(OrderItemService.class); List<OrderItem> orderItems = orderItemService.listByOrder(order); float total = 0; int totalNumber = 0; for (OrderItem oi :orderItems) { total+=oi.getNumber()*oi.getProduct().getPromotePrice(); totalNumber+=oi.getNumber(); productImageService.setFirstProdutImage(oi.getProduct()); } order.setTotal(total); order.setOrderItems(orderItems); order.setTotalNumber(totalNumber); order.setOrderItems(orderItems); } @CacheEvict(allEntries=true) public void add(OrderItem orderItem) { orderItemDAO.save(orderItem); } @Cacheable(key="'orderItems-one-'+ #p0") public OrderItem get(int id) { return orderItemDAO.findOne(id); } @CacheEvict(allEntries=true) public void delete(int id) { orderItemDAO.delete(id); } public int getSaleCount(Product product) { OrderItemService orderItemService = SpringContextUtil.getBean(OrderItemService.class); List<OrderItem> ois =orderItemService.listByProduct(product); int result =0; for (OrderItem oi : ois) { if(null!=oi.getOrder()) if(null!= oi.getOrder() && null!=oi.getOrder().getPayDate()) result+=oi.getNumber(); } return result; } @Cacheable(key="'orderItems-uid-'+ #p0.id") public List<OrderItem> listByUser(User user) { return orderItemDAO.findByUserAndOrderIsNull(user); } @Cacheable(key="'orderItems-pid-'+ #p0.id") public List<OrderItem> listByProduct(Product product) { return orderItemDAO.findByProduct(product); } @Cacheable(key="'orderItems-oid-'+ #p0.id") public List<OrderItem> listByOrder(Order order) { return orderItemDAO.findByOrderOrderByIdDesc(order); } }
package com.how2java.tmall.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.how2java.tmall.dao.OrderDAO; import com.how2java.tmall.pojo.Order; import com.how2java.tmall.pojo.OrderItem; import com.how2java.tmall.pojo.User; import com.how2java.tmall.util.Page4Navigator; import com.how2java.tmall.util.SpringContextUtil; @Service @CacheConfig(cacheNames="orders") public class OrderService { public static final String waitPay = "waitPay"; public static final String waitDelivery = "waitDelivery"; public static final String waitConfirm = "waitConfirm"; public static final String waitReview = "waitReview"; public static final String finish = "finish"; public static final String delete = "delete"; @Autowired OrderDAO orderDAO; @Autowired OrderItemService orderItemService; public List<Order> listByUserWithoutDelete(User user) { OrderService orderService = SpringContextUtil.getBean(OrderService.class); List<Order> orders = orderService.listByUserAndNotDeleted(user); orderItemService.fill(orders); return orders; } @Cacheable(key="'orders-uid-'+ #p0.id") public List<Order> listByUserAndNotDeleted(User user) { return orderDAO.findByUserAndStatusNotOrderByIdDesc(user, OrderService.delete); } @CacheEvict(allEntries=true) public void update(Order bean) { orderDAO.save(bean); } @Cacheable(key="'orders-page-'+#p0+ '-' + #p1") public Page4Navigator<Order> list(int start, int size, int navigatePages) { Sort sort = new Sort(Sort.Direction.DESC, "id"); Pageable pageable = new PageRequest(start, size,sort); Page pageFromJPA =orderDAO.findAll(pageable); return new Page4Navigator<>(pageFromJPA,navigatePages); } @CacheEvict(allEntries=true) public void add(Order order) { orderDAO.save(order); } @CacheEvict(allEntries=true) @Transactional(propagation= Propagation.REQUIRED,rollbackForClassName="Exception") public float add(Order order, List<OrderItem> ois) { float total = 0; add(order); if(false) throw new RuntimeException(); for (OrderItem oi: ois) { oi.setOrder(order); orderItemService.update(oi); total+=oi.getProduct().getPromotePrice()*oi.getNumber(); } return total; } @Cacheable(key="'orders-one-'+ #p0") public Order get(int oid) { return orderDAO.findOne(oid); } public void cacl(Order o) { List<OrderItem> orderItems = o.getOrderItems(); float total = 0; for (OrderItem orderItem : orderItems) { total+=orderItem.getProduct().getPromotePrice()*orderItem.getNumber(); } o.setTotal(total); } public void removeOrderFromOrderItem(List<Order> orders) { for (Order order : orders) { removeOrderFromOrderItem(order); } } public void removeOrderFromOrderItem(Order order) { List<OrderItem> orderItems= order.getOrderItems(); for (OrderItem orderItem : orderItems) { orderItem.setOrder(null); } } }
package com.how2java.tmall.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import com.how2java.tmall.dao.ProductImageDAO; import com.how2java.tmall.pojo.OrderItem; import com.how2java.tmall.pojo.Product; import com.how2java.tmall.pojo.ProductImage; import com.how2java.tmall.util.SpringContextUtil; @Service @CacheConfig(cacheNames="productImages") public class ProductImageService { public static final String type_single = "single"; public static final String type_detail = "detail"; @Autowired ProductImageDAO productImageDAO; @Autowired ProductService productService; @Autowired CategoryService categoryService; @Cacheable(key="'productImages-one-'+ #p0") public ProductImage get(int id) { return productImageDAO.findOne(id); } public void setFirstProdutImage(Product product) { ProductImageService productImageService = SpringContextUtil.getBean(ProductImageService.class); List<ProductImage> singleImages = productImageService.listSingleProductImages(product); if(!singleImages.isEmpty()) product.setFirstProductImage(singleImages.get(0)); else product.setFirstProductImage(new ProductImage()); //这样做是考虑到产品还没有来得及设置图片,但是在订单后台管理里查看订单项的对应产品图片。 } @CacheEvict(allEntries=true) public void add(ProductImage bean) { productImageDAO.save(bean); } @CacheEvict(allEntries=true) public void delete(int id) { productImageDAO.delete(id); } @Cacheable(key="'productImages-single-pid-'+ #p0.id") public List<ProductImage> listSingleProductImages(Product product) { return productImageDAO.findByProductAndTypeOrderByIdDesc(product, type_single); } @Cacheable(key="'productImages-detail-pid-'+ #p0.id") public List<ProductImage> listDetailProductImages(Product product) { return productImageDAO.findByProductAndTypeOrderByIdDesc(product, type_detail); } public void setFirstProdutImages(List<Product> products) { for (Product product : products) setFirstProdutImage(product); } public void setFirstProdutImagesOnOrderItems(List<OrderItem> ois) { for (OrderItem orderItem : ois) { setFirstProdutImage(orderItem.getProduct()); } } }
package com.how2java.tmall.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import com.how2java.tmall.dao.PropertyDAO; import com.how2java.tmall.pojo.Category; import com.how2java.tmall.pojo.Property; import com.how2java.tmall.util.Page4Navigator; @Service @CacheConfig(cacheNames="properties") public class PropertyService { @Autowired PropertyDAO propertyDAO; @Autowired CategoryService categoryService; @CacheEvict(allEntries=true) public void add(Property bean) { propertyDAO.save(bean); } @CacheEvict(allEntries=true) public void delete(int id) { propertyDAO.delete(id); } @Cacheable(key="'properties-one-'+ #p0") public Property get(int id) { return propertyDAO.findOne(id); } @CacheEvict(allEntries=true) public void update(Property bean) { propertyDAO.save(bean); } @Cacheable(key="'properties-cid-'+ #p0.id") public List<Property> listByCategory(Category category){ return propertyDAO.findByCategory(category); } @Cacheable(key="'properties-cid-'+#p0+'-page-'+#p1 + '-' + #p2 ") public Page4Navigator<Property> list(int cid, int start, int size,int navigatePages) { Category category = categoryService.get(cid); Sort sort = new Sort(Sort.Direction.DESC, "id"); Pageable pageable = new PageRequest(start, size, sort); Page<Property> pageFromJPA =propertyDAO.findByCategory(category,pageable); return new Page4Navigator<>(pageFromJPA,navigatePages); } }
package com.how2java.tmall.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import com.how2java.tmall.dao.PropertyValueDAO; import com.how2java.tmall.pojo.Product; import com.how2java.tmall.pojo.Property; import com.how2java.tmall.pojo.PropertyValue; import com.how2java.tmall.util.SpringContextUtil; @Service @CacheConfig(cacheNames="propertyValues") public class PropertyValueService { @Autowired PropertyValueDAO propertyValueDAO; @Autowired PropertyService propertyService; @CacheEvict(allEntries=true) public void update(PropertyValue bean) { propertyValueDAO.save(bean); } public void init(Product product) { PropertyValueService propertyValueService = SpringContextUtil.getBean(PropertyValueService.class); List<Property> propertys= propertyService.listByCategory(product.getCategory()); for (Property property: propertys) { PropertyValue propertyValue = propertyValueService.getByPropertyAndProduct(product, property); if(null==propertyValue){ propertyValue = new PropertyValue(); propertyValue.setProduct(product); propertyValue.setProperty(property); propertyValueDAO.save(propertyValue); } } } @Cacheable(key="'propertyValues-one-pid-'+#p0.id+ '-ptid-' + #p1.id") public PropertyValue getByPropertyAndProduct(Product product, Property property) { return propertyValueDAO.getByPropertyAndProduct(property,product); } @Cacheable(key="'propertyValues-pid-'+ #p0.id") public List<PropertyValue> list(Product product) { return propertyValueDAO.findByProductOrderByIdDesc(product); } }
package com.how2java.tmall.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import com.how2java.tmall.dao.ReviewDAO; import com.how2java.tmall.pojo.Product; import com.how2java.tmall.pojo.Review; @Service @CacheConfig(cacheNames="reviews") public class ReviewService { @Autowired ReviewDAO reviewDAO; @Autowired ProductService productService; @CacheEvict(allEntries=true) public void add(Review review) { reviewDAO.save(review); } @Cacheable(key="'reviews-pid-'+ #p0.id") public List<Review> list(Product product){ List<Review> result = reviewDAO.findByProductOrderByIdDesc(product); return result; } @Cacheable(key="'reviews-count-pid-'+ #p0.id") public int getCount(Product product) { return reviewDAO.countByProduct(product); } }
package com.how2java.tmall.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import com.how2java.tmall.dao.UserDAO; import com.how2java.tmall.pojo.User; import com.how2java.tmall.util.Page4Navigator; import com.how2java.tmall.util.SpringContextUtil; @Service @CacheConfig(cacheNames="users") public class UserService { @Autowired UserDAO userDAO; public boolean isExist(String name) { UserService userService = SpringContextUtil.getBean(UserService.class); User user = userService.getByName(name); return null!=user; } @Cacheable(key="'users-one-name-'+ #p0") public User getByName(String name) { return userDAO.findByName(name); } @Cacheable(key="'users-one-name-'+ #p0 +'-password-'+ #p1") public User get(String name, String password) { return userDAO.getByNameAndPassword(name,password); } @Cacheable(key="'users-page-'+#p0+ '-' + #p1") public Page4Navigator<User> list(int start, int size, int navigatePages) { Sort sort = new Sort(Sort.Direction.DESC, "id"); Pageable pageable = new PageRequest(start, size,sort); Page pageFromJPA =userDAO.findAll(pageable); return new Page4Navigator<>(pageFromJPA,navigatePages); } @CacheEvict(allEntries=true) public void add(User user) { userDAO.save(user); } }
增值内容,请先登录
完整的 Springboot 模仿天猫项目,使用 Springboot 、Vue.js、shiro、redis、elasticsearch 等一整套技术栈, 从无到有涵盖全部129个知识点,565个开发步骤, 充实 Springboot 项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用爬虫已经被系统记录,请勿使用爬虫,增大封号风险。 如果是误封 ,请联系站长,谢谢


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2021-03-10 在前面师兄弟的脚步下进步,站长康康这里;
很倒霉的死小孩

站长,看了下其它师兄弟的提问才晓得 分页对象Page4Navigator扩展的属性:Page对象是没有set和get方法的。。。。 分页对象Page4Navigator扩展的属性:Page对象是没有set和get方法的。。。。 分页对象Page4Navigator扩展的属性:Page对象是没有set和get方法的。。。。 我觉得您可以在分类教程那里说明一下。。。。感觉很多人都会默认写了set和get方法 因为是自己写,所以我理所当然的以为也有set和get方法 前面没有问题,但是到redis这里就有反序列化的问题了。。。。。。害,我处理了整整一天; 不过也受益匪浅,晓得了get方法异常对Jackson有关系;也正是有关系才能不使用重写PageImpl方法 也能解决PageImpl没有无参构造方法反序列化的问题!




4 个答案

很倒霉的死小孩
答案时间:2021-04-15
@可敢离我近点 这是因为使用Jpa提供的Page对象,其实现类PageImpl是没有无参构造的,又因为在Jackson2JsonRedisSerializer中进行将redis数据反序列化的时候,必须要有无参构造函数,才能进行,不然就会报下面的异常: com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of org.springframework.data.domain.Page: abstract types either need to be mapped to concrete types, 也就是站长使用的Jackson2JsonRedisSerializer类,这个类进行redis数据反序列化的时候,必须要有无参构造函数。 但是实际上实现类PageImpl没有,所以会报错。 然鹅对于Jackson2JsonRedisSerializer来说,不只是要有无参构造函数,根据百度的结果晓得了 没有get方法对于Jackson2JsonRedisSerializer来说,也会造成无法反序列化。 现在的情况是,我们不需要这个对象反序列化。。。我们只需要这个对象的功能 所以站长在实现PageImpl类功能的时候,并不提供Page对象的pageFromJPA这个属性的set和get方法。这样就无法反序列化了,也就是PageImpl这个类无法反序列化了。 但是仍然将PageImpl的功能实现了。 这就是委派的威力了。 不得不说站长这招是真的高明~ 这样也避免了去实现Page接口或者是继承Page的实现类PageImpl。 不晓得这样说,你明白不(流鼻涕表情)

可敢离我近点
答案时间:2021-03-30
晓得了get方法异常对Jackson有关系;也正是有关系才能不使用重写PageImpl方法 也能解决PageImpl没有无参构造方法反序列化的问题! 老哥,你最后这段话什么意思呢? 这里为什么不可以有get set方法呢??? 为啥会引起redis的序列化异常呢?

可敢离我近点
答案时间:2021-03-30
兄弟们,求问个东西。 站长的项目集成redis时候出现了json识别错误 和这位兄弟的情况很相似。 但是我的情况是,我把get set方法都加上了,看了控制台的输出,貌似是要修改官方的代码。 我从站长网站上下的代码也跑不通,也是这个错误。。。。。 Redis数据库是有数据的,但是就是没办法拿出来。 急死孩子了啊

how2j
答案时间:2021-03-12
可以通过比较来发现哪里不一样,不过确实提醒一下更好。



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2020-09-02 请问本项目的双写一致性是如何解决的?
回溯

请问本项目的双写一致性是如何解决的?




2 个答案

how2j
答案时间:2020-09-02
开发的时候没有考虑到这个问题。 可参考这篇文章的做法: https://www.jianshu.com/p/078fdaf57d2e

回溯
答案时间:2020-09-02
是更新数据库,删除缓存吧



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2020-08-11 站长,我现在每次修改代码都要重写上传war包进行部署,有什么办法或者什么工具可以直接在部署环境对代码进行修改呢?谢谢
2020-07-28 redis提示我没有启动默认conf文件,但是我按照视频教程做的,也自己百度了解决方法,按照百度的方法启动redis也还是在客户端可视化软件上看不到,请问怎么解决启动redis问题
2020-07-27 redis提示我没有启动默认conf文件,可视化工具没有展示redis缓存内容,是需要连接什么


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 41 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 实践项目-天猫整站Springboot-Redis 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 496725845
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图