springboot-redis、rockectMQ

2021-02-23   MarsHu   springboot   springboot  

订单的有效期,库存的归还

预扣库存情况下,怎么归还库存,什么时候归还,谁来触发归还库存的操作。

什么时候:订单过期时,归还库存。

谁来触发:

主动轮询,不够精确。定时器,检查数据库所有到期订单,并且归还.

延迟消息队列:Redis\RocketMQ

Redis:键名通知—不能保证100%

Springboot-JWT令牌

2021-02-21   MarsHu   springboot   springboot  

TokenGetDTO–基于jwt登录校验实体

1.TokenGetDTO:

package com.zhqx.missyou.dto;

import com.zhqx.missyou.core.enumeration.LoginType;
import com.zhqx.missyou.dto.validators.TokenPassword;
import lombok.Getter;
import lombok.Setter;

import javax.validation.constraints.NotBlank;

/**
 * 通用用户登录dto
 * 在不同登录方式中
 * account和password代表的内容不同
 */
@Getter
@Setter
public class TokenGetDTO {
    @NotBlank(message = "account不允许为空")
    private String account;
    @TokenPassword(max=30, message = "{token.password}")
    private String password;

    private LoginType type;
}

Springboot-单体JSON对象的处理

2021-02-20   MarsHu   springboot   springboot  

json字符格式字段数据返回内容

观察数据库表sku,字段specs的格式为json类型,值格式为如下内容:

[{"key": "颜色", "value": "青蓝色", "key_id": 1, "value_id": 1}, {"key": "尺寸", "value": "7英寸", "key_id": 2, "value_id": 5}]

我们可以观察得出,其值为json格式数组,并且每个元素应该代表一个json对象。我们在Sku实体中是以private String specs;形式去接收的。

当我们访问请求localhost:8080/v1/spu/id/28/detail,因为我们在Spu中设置了关联关系,所以得到如下有关skuList结果片段:

        {
            "id": 43,
            "price": 999.00,
            "discount_price": null,
            "online": true,
            "img": "http://xxx.xxx.xxx/7c462cf2-3874-4ecc-85f9-6b4a0fde4623.png",
            "title": "Ins复古金色落地灯(落地灯)",
            "spu_id": 28,
            "specs": "[{\"key\": \"颜色\", \"value\": \"金色\", \"key_id\": 1, \"value_id\": 27}, {\"key\": \"台灯高低\", \"value\": \"落地灯\", \"key_id\": 8, \"value_id\": 38}]",
            "code": "28$1-27#8-38",
            "stock": 19,
            "category_id": 23,
            "root_category_id": 4
        }

Springboot-数据的返回

2021-02-19   MarsHu   springboot   springboot  

Jaskson序列化库的重要配置

通过前面的步骤,我们可以通过PostMan发送请求,拿回数据。通过访问:localhost:8080/v1/banner/name/b-1,拿回以下数据。

{
    "createTime": null,
    "updateTime": null,
    "deleteTime": null,
    "id": 1,
    "name": "b-1",
    "description": "首页顶部主banner",
    "title": null,
    "img": "http://xxx.xxx.xxx/d87e180f-0f8a-480c-966a-f2f487b801cc.png",
    "items": [
        {
            "createTime": null,
            "updateTime": null,
            "deleteTime": null,
            "id": 12,
            "img": "http://xxx.xxx.xxx/m1.png",
            "keyword": "t-2",
            "type": 3,
            "bannerId": 1,
            "name": null
        },
        {
            "createTime": null,
            "updateTime": null,
            "deleteTime": null,
            "id": 13,
            "img": "http://xxx.xxx.xxx/assets/702f2ce9-5729-4aa4-aeb3-921513327747.pn",
            "keyword": "23",
            "type": 1,
            "bannerId": 1,
            "name": null
        },
        {
            "createTime": null,
            "updateTime": null,
            "deleteTime": null,
            "id": 14,
            "img": "http://xxx.xxx.xxx/assets/b8e510a1-8340-43c2-a4b0-0e56a40256f9.png",
            "keyword": "24",
            "type": 1,
            "bannerId": 1,
            "name": null
        }
    ]
}

Springboot-JPA基础内容

2021-02-18   MarsHu   springboot   springboot  

多环境配置文件(profiles)以及启用方式

假设在resources目录下新建一个配置文件夹config。在config文件夹下新建2个配置类。application-dev.yml和application-prod.yml。

这里需要注意的时,配置文件可以放在resources目录下任意位置,但是命名的规范必须是以application-开头。

application-dev.yml内容如下:

server:
  port: 8081

application-prod.yml内容如下:

server:
  port: 8080

将公共的环境配置放在application.yml中,并且配置需要运行dev还是prod配置,内容如下:

spring:
  profiles:
	#读取dev配置,如果需要读取prod配置,则将dev改成prod
    active: dev

zhqx:
  api-package: com.zhqx.missyou.api

idea中新建的.yml文件没有提示解决

1.点击File->2.点击Project Structure->3.点击Facets->4.点击中间栏目的Spring(项目名)->5.点击右边栏的小树叶(Customize spring boot)

Springboot请求参数获取和验证

2021-02-17   MarsHu   springboot   springboot  

请求中参数值,?号后参数值获取

当前请求为http://localhost:8080/v1/banner/test/1?name=tom。如何在控制器中获取路径的参数值1,以及参数name的值

使用@PathVariable注解来获取请求地址中参数值,使用@RequestParam来获请求地址取携带的参数值。当携带的参数名与方法参数名一致时,可以省略

package com.zhqx.missyou.api.v1;

import com.zhqx.missyou.exception.http.ForbiddenException;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/banner")
public class BannerController {

    @GetMapping("/test/{id}")
    public String test(@PathVariable Integer id,@RequestParam String name) throws Exception {
        throw new ForbiddenException(10001);
    }
}

Springboot全局异常处理

2021-02-16   MarsHu   springboot   springboot  

如何统一捕获异常

package com.zhqx.missyou.core;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

import javax.servlet.http.HttpServletRequest;

@ControllerAdvice
public class GlobalExceptionAdvice {

    @ExceptionHandler(value = Exception.class)
    public void handleException(HttpServletRequest request, Exception e) {
        //处理逻辑
    }
}

异常分类Error、CheckedException与RunTimeException

Error:错误,通常是系统级别的。Exception:异常

CheckedException:必须进行处理的异常,编译阶段不处理就会报错—通常是我们可以处理的异常

RuntimeException:运行时异常—通常是我们不可以处理的异常


       2 / 10